为什么方法在调用时不返回其最后一个表达式?

时间:2013-02-27 14:43:33

标签: ruby

当我通过一个对象调用它时,我正在使用该方法返回的最后一个表达式。

使用下面的概念代码可以工作。

class Simple
  def foo
    2 + 2
  end
end
#=> nil
simple = Simple.new
#=> #<Simple:0x11eb390>
simple.foo
#=> 4

但为什么下面的代码会返回这样的编码值,而不是1520

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>

同样的结果。

2 个答案:

答案 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
好吧,好吧,“一切正常”可能有点误导。但是,正如您所看到的,发生的所有内容正如您所期望的那样:putsto_s上调用10,这会将5添加到{{} 1}}返回10,然后在15上调用to_s,这会15返回5,然后在{{1}上调用20等等。

to_s

现在,一切都按预期工作。

答案 1 :(得分:0)

如果你为自己添加5,你会得到另一个Fixnum。

当您打印修复时,其修改过的to_s不显示结果,您开始看到生成的对象而不是fixnum的值。