如果我运行以下代码,前两行将返回我所期望的。然而,第三个返回 2 的二进制表示。
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
我知道在调用时传入 2to_s
会将我的输出转换为二进制,但是为什么在第三种情况下to_s
忽略了呢?*
如果这有什么不同,我正在运行 Ruby 1.9.2。
如果我运行以下代码,前两行将返回我所期望的。然而,第三个返回 2 的二进制表示。
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
我知道在调用时传入 2to_s
会将我的输出转换为二进制,但是为什么在第三种情况下to_s
忽略了呢?*
如果这有什么不同,我正在运行 Ruby 1.9.2。
对,正如 Nanoda 已经提到的,Ruby 解释
2.to_s *2
作为
2.to_s(*2)
因为方法调用中的括号在 Ruby 中是可选的。这里的星号是所谓的splat 运算符。
这里唯一令人费解的问题是为什么*2
评估为2
. 当您在方法调用之外使用它时,splat 运算符将所有内容强制转换为数组,以便
a = *2
会导致a
being [2]
。在方法调用中,splat 运算符的作用正好相反:将任何东西解包为一系列方法参数。向它传递一个三成员数组,它将作为三个方法参数的结果。传递一个标量值,它将作为单个参数转发。所以,
2.to_s *2
本质上是一样的
2.to_s(2)
在第三行中,您使用to_s
“splat”为 2 调用方法,其计算结果为 2(在方法调用中),因此返回不同 base 中的数字。