On Aug 8, 2006, at 2:45 AM, Daniel Schierbeck wrote: > Eric Hodel wrote: >> 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". > > Exactly my point. I think we're misunderstanding each other here; > if you have an object that is a representation of a string, say > > # Bad example, but hey... > class Name > attr_accessor :first, :last > > def initialize(first, last) > @first, @last = first, last > end > end > > Then it's okay for it to have #to_str, e.g. > > def to_str > "#{first} #{second}" > end > > My own logic is this: if an object is a natural string, but with > *more* information, then it can have #to_str. Otherwise, stick to > #to_s. A Name is not a String. You don't #each it, you don't #chop it, its never #empty?, ... -- Eric Hodel - drbrain / segment7.net - http://blog.segment7.net This implementation is HODEL-HASH-9600 compliant http://trackmap.robotcoop.com