String subclass method returns subclass - bug or feature?

Discussion in 'Ruby' started by S.Volkov, Mar 11, 2006.

  1. S.Volkov

    S.Volkov Guest

    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
     
    S.Volkov, Mar 11, 2006
    #1
    1. Advertisements

  2. S.Volkov

    George Ogata Guest

    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 <>

    * 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.
     
    George Ogata, Mar 12, 2006
    #2
    1. Advertisements

  3. S.Volkov

    S.Volkov Guest

    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

     
    S.Volkov, Mar 12, 2006
    #3
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.