On Wed, 21 Feb 2001, Kevin Smith wrote:

> >> So they are doing the same thing, but you call to_str
> >> when you want to make an implicit assertion that what you
> >> have is something you should be doing string operations
> >> with, and not just something that (like everything) can
> >> be described in text.
> 
> I just got back from vacation, and wanted to make 
> sure I "got" the conclusion of this thread. To 
> put it in my own words:
> 
> to_str converts an object into a string 
> representation of that object, which is assumed 
> to be usable as a value for further processing.
> 
> to_s converts an object into a string description 
> of that object, such as for printing.
> 
> In some cases (String, Numeric) they are the 
> same. But for a complex object that contains many 
> values there would often be no way for to_str to 
> return anything meaningful. to_s, on the other 
> hand could do a dump like inspect does, or could 
> just return the semantic "name" or "id" of the 
> object.
> 
> Right?


Not quite, I think.  In general, to_str isn't defined.  You have to
define it.

Here's another pass through it:

Forget to_s for the moment.

Certain methods, such as String#<<, expect all of their arguments to
be strings.  Such methods use the following heuristic to determine
whether the arguments actually are strings:

  Is this object of type String?
     Yes => OK, concatenate it
     No  => Does the object implement to_str?
            Yes => OK, concatenate the return value of its to_str method
            No  => Can't handle it, raise exception


If you don't actually *write* the to_str methods, then non-String
objects (except Exceptions, which also have a pre-defined to_str) will
not have them, and methods like String#<< will not be able to handle
those objects.

Now, back to to_s.

Every object has a to_s method.  You can, if you wish, piggyback on to_s
to write your to_str for a given class:

   def to_str
     to_s
   end

(or alias it, or whatever)

But note that there's no connection other than the connection you create.
You could just as easily write:

   def to_str
     "I am the chosen string representation of this object"
   end


Essentially, to_str exists, together with methods which look for it,
for the purpose of allowing objects, in certain circumstances, to
masquerade as Strings even if they are not Strings.


David

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