在类上定义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"
一样吗?
答案 0 :(得分:2)
两种情况之间的关键区别在于字符串插值"#{}"
隐式调用to_s
,而Fixnum#+
不会在其参数上隐式调用to_i
。
定义to_i
只允许您(显式)调用它。是否隐式调用它取决于使用的位置。您无法通过定义to_i
来隐式调用to_i
。如果你真的想这样做,你必须修改Fixnum#+
。