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_int,这将有效,请参阅stackoverflow.com/questions/11182052/…
-
@matt你还想介绍一下吗? 我做了这个:def to_int; 0; end,它的错误与上面的to_i定义相同。
-
@matt:不,它是coerce:class Foo; def coerce(n) [0, n] end end。
-
@cremno是的,你是对的,对不起。 to_int将用于其他事情,例如将其用作数组索引,但您需要coerce进行算术运算。
这两种情况之间的关键区别在于,字符串插值"#{}"隐式调用to_s,而Fixnum#+不会在其参数上隐式调用to_i。
定义to_i只允许您(显式)调用它。 是否隐式调用它取决于使用的位置。 你无法通过定义to_i来隐式调用to_i。 如果你真的想这样做,你必须修改Fixnum#+。