定义“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_s
而 Fixnum#+
不隐式调用 to_i
其参数。
定义 to_i
只允许您调用它(明确地)。它是否被隐式调用取决于它的使用位置。您无法仅通过定义 to_i
来使 to_i
被隐式调用。真要做的话,还得修改Fixnum#+
.
在 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_s
而 Fixnum#+
不隐式调用 to_i
其参数。
定义 to_i
只允许您调用它(明确地)。它是否被隐式调用取决于它的使用位置。您无法仅通过定义 to_i
来使 to_i
被隐式调用。真要做的话,还得修改Fixnum#+
.