1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Make String methods return String instances when called on a subclass instance

This modifies the following String methods to return String instances
instead of subclass instances:

* String#*
* String#capitalize
* String#center
* String#chomp
* String#chop
* String#delete
* String#delete_prefix
* String#delete_suffix
* String#downcase
* String#dump
* String#each/#each_line
* String#gsub
* String#ljust
* String#lstrip
* String#partition
* String#reverse
* String#rjust
* String#rpartition
* String#rstrip
* String#scrub
* String#slice!
* String#slice/#[]
* String#split
* String#squeeze
* String#strip
* String#sub
* String#succ/#next
* String#swapcase
* String#tr
* String#tr_s
* String#upcase

This also fixes a bug in String#swapcase where it would return the
receiver instead of a copy of the receiver if the receiver was the
empty string.

Some string methods were left to return subclass instances:

* String#+@
* String#-@

Both of these methods will return the receiver (subclass instance)
in some cases, so it is best to keep the returned class consistent.

Fixes [#10845]
This commit is contained in:
Jeremy Evans 2020-10-24 11:52:30 -07:00
parent 4f5d14eb8c
commit 58325daae3
Notes: git 2020-11-21 09:30:48 +09:00
28 changed files with 591 additions and 211 deletions

View file

@ -32,10 +32,20 @@ describe :string_times, shared: true do
@object.call("", max_long).should == ""
end
it "returns subclass instances" do
@object.call(MyString.new("cool"), 0).should be_an_instance_of(MyString)
@object.call(MyString.new("cool"), 1).should be_an_instance_of(MyString)
@object.call(MyString.new("cool"), 2).should be_an_instance_of(MyString)
ruby_version_is ''...'3.0' do
it "returns subclass instances" do
@object.call(MyString.new("cool"), 0).should be_an_instance_of(MyString)
@object.call(MyString.new("cool"), 1).should be_an_instance_of(MyString)
@object.call(MyString.new("cool"), 2).should be_an_instance_of(MyString)
end
end
ruby_version_is '3.0' do
it "returns String instances" do
@object.call(MyString.new("cool"), 0).should be_an_instance_of(String)
@object.call(MyString.new("cool"), 1).should be_an_instance_of(String)
@object.call(MyString.new("cool"), 2).should be_an_instance_of(String)
end
end
ruby_version_is ''...'2.7' do