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
On 29.05.2007 10:51, [email protected] wrote:
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
unknown 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?
/kim
Not able to understand what you are actually asking. Can you put little
detail on this.
On May 29, 11:04 am, Robert K. [email protected] wrote:
def initialize(n)
puts n.to_s # prints ZNum
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
On 29.05.2007 14:50, [email protected] wrote:
@n=n
result of to_s is not String.
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
On Tue, May 29, 2007 at 09:55:04PM +0900, [email protected] wrote:
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.
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.
the result of foo.class is not of type String, but of type Class. when
you
say puts foo.to_s, the puts method is calling to_s on the class that
you’ve
returned from calling to_s. To get the expected result, define to_s
like
this:
def to_s
self.class.to_s
end
OR
def to_s
“#{self.class}” #this is not as efficient, but you’re guaranteed to
get
a String result
end
-dave
On May 29, 12:15 pm, Rohan D. [email protected] wrote:
def to_s
/kim
Not able to understand what you are actually asking. Can you put little
detail on this.
–
Posted viahttp://www.ruby-forum.com/.
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