定义“to_i”以便隐式调用

Defining `to_i` so that it is called implicitly

在 class 上定义 to_s 如我所料:

class Foo
  def to_s
    "Joe"
  end 
end

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

我尝试使用 to_i 并希望它以类似的方式工作。我希望通过将 to_i 定义为一个数字,然后在任何需要数字的地方,该对象将 return 该数字代替该对象;在类似下面的情况下,我希望它是 return 整数 5。相反,它会引发错误:

class Foo
  def to_i
    0
  end
end

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

定义 to_i 会启用什么?你如何利用它?我可以将此对象隐式表示为整数并且 return 0 就像对象隐式 return 字符串 "Joe" 一样吗?

这两种情况的关键区别在于字符串插值 "#{}" 隐式调用 to_sFixnum#+ 不隐式调用 to_i 其参数。

定义 to_i 只允许您调用它(明确地)。它是否被隐式调用取决于它的使用位置。您无法仅通过定义 to_i 来使 to_i 被隐式调用。真要做的话,还得修改Fixnum#+.