If there is a Ruby FAQ, the answer below should be in it. IMHO... /j David Alan Black wrote: > > 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