当我通过一个对象调用它时,我正在使用该方法返回的最后一个表达式。
使用下面的概念代码可以工作。
class Simple
def foo
2 + 2
end
end
#=> nil
simple = Simple.new
#=> #<Simple:0x11eb390>
simple.foo
#=> 4
但为什么下面的代码会返回这样的编码值,而不是15
和20
?
class Fixnum
def to_s
self + 5
end
end
#=> nil
puts 10
#<Fixnum:0x000015>
#=> nil
puts 15
#<Fixnum:0x00001f>
#=> nil
任何人都可以帮助我理解这个概念吗?
修改
class Fixnum
def to_s
self + 5
end
end
#=> nil
10.to_s
#=> #<Fixnum:0x000029>
同样的结果。
答案 0 :(得分:3)
to_s
的合同要求您返回String
。但是,您正在返回Fixnum
。如果你违反合同,可能会发生各种奇怪的事情。
如果您从String
方法正确返回to_s
,则一切正常,您可以预期:
class Fixnum
def to_s
"#{self + 5}"
end
end
puts 10
# SystemStackError: stack level too deep
好吧,好吧,“一切正常”可能有点误导。但是,正如您所看到的,发生的所有内容正如您所期望的那样:puts
在to_s
上调用10
,这会将5
添加到{{} 1}}返回10
,然后在15
上调用to_s
,这会15
返回5
,然后在{{1}上调用20
等等。
to_s
现在,一切都按预期工作。
答案 1 :(得分:0)
如果你为自己添加5,你会得到另一个Fixnum。
当您打印修复时,其修改过的to_s不显示结果,您开始看到生成的对象而不是fixnum的值。