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