On Mon, 19 Feb 2001, craig duncan wrote:

> Ben Tilly wrote:
> > 
> > craig duncan <duncan / nycap.rr.com> wrote:
> > >
> > >Yukihiro Matsumoto wrote:
> > > >
> > > > 'to_s' is a mean to convert something into a string (if you really
> > > > want to), OTOH 'to_str' is a mean for something that wants to pretend
> > > > to be a string. to_a and to_ary are in similar relationship.
> > >
> > >The problem with this explanation is that i have no idea what it means for
> > >something to "pretend to be a string" as opposed to being one.
> > 
> > Think of it this way.  foo.to_s tells foo to describe itself
> > as a string.  foo.to_str checks with foo that it is OK to
> > think of foo as being its description, and gets that
> > description.
> > 
> > So to_str is the same as to_s except with an extra assertion
> > about the correct usage of that object.
> 
> Wow!  That was a little too subtle for me to guess.  I think because of the
> minimalism that i (initially) perceive to be lacking in this design.  to_str
> can always fill in for to_s, yes?  

No, because to_s is inherited from Object by every object, whereas
to_str is only defined for a couple of built-in types (String,
Exception).

> So what do you need to_s for?  I guess you could say that you use
> to_s when you _don't_ want the object to be used as a string
> . . . even though you want it to _appear_ that way.  ?  Oh, well, i
> guess i can accept that there _might_ be some usage for that
> distinction (can't think what, though).  Thanks, Ben.

Here's my current understanding of it, for what it's worth:

Every object will respond to to_s, and to_s will always give you
*something*.  But sometimes you might want a given class to have a
non-canonical way of showing itself as a string.  In such a case, you
can define a to_str method, such that your objects have their own idea
of how to represent themselves as strings.

A little test/demo:

   class Pretender

     attr_reader :to_str

     def initialize(s)
       @to_str = "I am a Pretender object initialized with #{s}."
     end

   end

   p = Pretender.new(Math::PI)

   puts "Canonical/inherited conversion to string:"
   puts p.to_s
   puts
   puts "Pretender object's own choice as to how to appear as a string:"
   puts p.to_str


Once an object has its to_str method, it will be able to respond with
something when it is asked to do so by (for example) String#<<.  


David

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