Robert Klemme
5/29/2007 12:55:00 PM
On 29.05.2007 14:50, kimersen@gmail.com wrote:
> On May 29, 11:04 am, Robert Klemme <shortcut...@googlemail.com> 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 #<ZNum:0xb75dfcc8>
>>> 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