From: Robert Klemme Date: 2007-05-29T22:05:07+09:00 Subject: Re: Overriding to_s On 29.05.2007 14:50, kimersen@gmail.com wrote: > On May 29, 11:04 am, Robert Klemme wrote: >> On 29.05.2007 10:51, kimer...@gmail.com wrote: >> >> >> >>> Hi, >>> I'm playing around with ruby trying to understand whats going on, and >>> here is something I don't understand. >>> class ZNum >>> def initialize(n) >>> @n=n >>> end >>> def to_s >>> self.class >>> end >>> end >>> n = ZNum.new(1234) >>> puts n # prints # >>> puts n.to_s # prints ZNum >>> In both cases it uses ZNum#to_s, but the results are different. Why? >> Because puts will revert to something else (likely #inspect) if the >> result of to_s is not String. >> >> irb(main):001:0> class Foo >> irb(main):002:1> def to_s; self.class.to_s end >> irb(main):003:1> end >> => nil >> irb(main):004:0> puts Foo.new >> Foo >> => nil >> >> Kind regards >> >> robert > > My understanding of puts is that it puts the result of to_s. > puts n and puts n.to_s are the same then and should in my example > print the same. No, they are not the same because to_s returns the class. You really have "puts foo" and "puts Foo" ("puts ZNum" in your case). > But they don't and that is for me a bit annoying because I thought I > understood what was going on. Please carefully reread my comment. Since you chose to make to_s return something that is *not a String* you get the behavior that you see. robert