On Aug 7, 2006, at 3:30 PM, Daniel Schierbeck wrote:
> Eric Hodel wrote:
>> On Aug 6, 2006, at 7:55 AM, Daniel Schierbeck wrote:
>>> I'd do it like this:
>>>
>>>   class SomeClass
>>>     def foo(obj)
>>>       str = obj.to_str
>> Don't call to_str, call to_s.
>>>       puts str + str # or `str * 2'
>>>       puts str.reverse
>>>     end
>>>   end
>>>
>>> Though I know some very smart people on this list disagree with me.
>> Only because you call to_str.  This is not the reason it exists.
>
> I favor using #to_str when I want to treat an object like a string.  
> Practically all classes implement #to_s, so it's not really a type  
> restriction. We're trying to solve two different problems -- I want  
> to let the caller know if he sent the wrong kind of object as an  
> argument. That's type checking. If you want to convert any object  
> received to a string, then we're talking type conversion, which I  
> think should be left to the caller in many cases. But that's just  
> my humble opinion, of course.

#to_str is not for type conversion.  It exists for classes that duck  
type completely to String and is called when a C string is needed by  
a method in String to improve performance.  In other words, #to_str  
should only be implemented on objects that are already "Strings".

#to_s is for type conversion.  Trust your users to provide a  
meaningful #to_s.  Don't force them to inappropriately implement  
#to_str.

-- 
Eric Hodel - drbrain / segment7.net - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com