String subclass method returns subclass - bug or feature?

S

S.Volkov

Could you please explain me why String instance methods return subclass,
and MyStr#to_s returns String, not the receiver as specified?

# here is the test code
$ cat tStringSubClass.rb
class MyStr < String
def rest
self[1..-1]
end
end
ms = MyStr.new('ABC')
puts \
'I got ' + ms.class.name,
'Expect String, get:',
ms.rest.class,
ms.downcase.class,
ms.succ.class,
ms[1..-1].class,
ms.split(//).map{ |s| s.class },
'Expect MyStr, get:',
ms.to_s.class,
ms.to_str.class
# and here is the result
$ ruby tStringSubClass.rb
I got MyStr
Expect String, get:
MyStr
MyStr
MyStr
MyStr
MyStr
MyStr
MyStr
Expect MyStr, get:
String
String
 
G

George Ogata

S.Volkov said:
Could you please explain me why String instance methods return subclass,
and MyStr#to_s returns String, not the receiver as specified?

String (and Array) methods that return new strings (arrays) tend to
return instances of the receiver's class rather than String. This
often makes subclassing a bit less painful, although a couple of pies
have been flung over it too:

* [ruby-talk:54225] ( http://rubyurl.com/dv2 )
* [ruby-talk:55268] ( http://rubyurl.com/T5G )
* [ruby-core:801] ( http://rubyurl.com/Ic6 )

That last thread is probably what led to the following Changelog
entry, which explains the behaviour of MyStr#to_s you saw.

Mon Feb 10 10:14:26 2003 Yukihiro Matsumoto <[email protected]>

* array.c (rb_ary_to_a): return value should be an Array if the
receiver is an instance of subclass of Array.

* string.c (rb_str_to_s): return value should be a String if the
receiver is an instance of subclass of String.
 
S

S.Volkov

Thanks for references,
I understand that it was discussed already, and decision was made;
imho: it's irregular and not OO, but who cares about formal, theoretical
correctness, 'be practical' criteria rules!

Regarding 'to_s, to_str returning String': hope documentation will be fixed;

regards
Sergey

George Ogata said:
S.Volkov said:
Could you please explain me why String instance methods return subclass,
and MyStr#to_s returns String, not the receiver as specified?

String (and Array) methods that return new strings (arrays) tend to
return instances of the receiver's class rather than String. This
often makes subclassing a bit less painful, although a couple of pies
have been flung over it too:

* [ruby-talk:54225] ( http://rubyurl.com/dv2 )
* [ruby-talk:55268] ( http://rubyurl.com/T5G )
* [ruby-core:801] ( http://rubyurl.com/Ic6 )

That last thread is probably what led to the following Changelog
entry, which explains the behaviour of MyStr#to_s you saw.

Mon Feb 10 10:14:26 2003 Yukihiro Matsumoto <[email protected]>

* array.c (rb_ary_to_a): return value should be an Array if the
receiver is an instance of subclass of Array.

* string.c (rb_str_to_s): return value should be a String if the
receiver is an instance of subclass of String.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,023
Latest member
websitedesig25

Latest Threads

Top