定义`to_i`以便隐式调用它

时间:2015-10-12 01:48:33

标签: ruby implicit-cast

在类上定义to_s可以按预期工作:

class Foo
  def to_s
    "Joe"
  end 
end

f = Foo.new
"hello #{f}" # => "hello Joe"

我尝试使用to_i并期望它以类似的方式工作。我希望通过将to_i定义为数字,然后在预期数字的任何地方,对象将在对象的位置返回该数字;在类似下面的情况下,我希望它返回整数5。相反,它会引发错误:

class Foo
  def to_i
    0
  end
end

f = Foo.new
5 + f # => TypeError: Foo can't be coerced into Fixnum

定义to_i启用了什么?你是如何利用它的?我可以隐式地将此对象表示为整数并返回0,就像对象隐式返回字符串"Joe"一样吗?

1 个答案:

答案 0 :(得分:2)

两种情况之间的关键区别在于字符串插值"#{}"隐式调用to_s,而Fixnum#+不会在其参数上隐式调用to_i

定义to_i只允许您(显式)调用它。是否隐式调用它取决于使用的位置。您无法通过定义to_i来隐式调用to_i。如果你真的想这样做,你必须修改Fixnum#+