关于ruby:定义`to_i`以便隐式调用它

Defining `to_i` so that it is called implicitly

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

1
2
3
4
5
6
7
8
class Foo
  def to_s
   "Joe"
  end
end

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

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

1
2
3
4
5
6
7
8
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"一样吗?


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

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