Overriding to_s

K

kimersen

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?

/kim
 
R

Robert Klemme

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
 
R

Rohan Dey

unknown said:
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?

/kim


Not able to understand what you are actually asking. Can you put little
detail on this.
 
K

kimersen

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.
But they don't and that is for me a bit annoying because I thought I
understood what was going on.

/kim
 
R

Robert Klemme

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
 
B

Brian Candler

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.
But they don't and that is for me a bit annoying because I thought I
understood what was going on.

Yes, but what do you expect "puts" to do when it calls to_s on an object,
but the result is not a string? Raise an exception perhaps? It's more
friendly for puts to have a fallback behaviour.

Note: there's one other special case I'm aware of. If you do
puts nil
then you get the string "nil" printed (plus newline). However, nil.to_s is
the empty string.

Regards,

Brian.
 
K

kimersen

Not able to understand what you are actually asking. Can you put little
detail on this.

I'm working on an interface for some legacy data.
The legacy data will be stored in objects as ruby numbers (fixnum,
bignum and float), but I need to override ruby's number formating. My
example above has no practical value, it's just some odd behavior that
I would like to understand before I design my legacy interface.

/kim
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,143
Latest member
DewittMill
Top