Hi --

On Sat, 8 Feb 2003, J.Herre wrote:

> It make sense that String#scan, String#slice, String#dup all return
> various parts of
> the given string.  Would it make sense for SpecializeString#dup to
> return a
> String?  Shouldn't #slice, #split and #scan do the same thing?
>
> Why not assume that a substring of a string is the same kind of string?
>   What's
> the advantage of the old behavior?

Even if the new class is specialized, substrings of it may not be
similarly specialized -- in which case, it's misleading to have them
be instances of the new class.  For example:

  class Name < String
    def initial
      scan(/[A-Z]/)[0]
    end
  end

  n = Name.new("David")
  i = n.initial          # String in 1.6.8, Name in 1.8.0

Here, it doesn't seem logical (to me) for an initial to be a Name
object.  (Yes, I could have done self[0].chr, but I need to illustrate
this :-)

I don't think having the initial be a String is a demotion in a case
like this.  It's just coincidence that the superclass of self's class
happens to be the same as the class of objects returned by #scan.  If
you had:

  class Title < String
    def separator
      " "
    end
  end

you wouldn't expect " " to be a Title object.  Similarly (I would
argue), the substring "D" is just a string, even though it happens to
come from an operation on a Name object.


David

-- 
David Alan Black
home: dblack / candle.superlink.net
work: blackdav / shu.edu
Web:  http://pirate.shu.edu/~blackdav