如果我运行以下代码,前两行将返回我期望的内容。但是,第三个返回2的二进制表示。
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
我知道在调用to_s
时传入2会将我的输出转换为二进制,但为什么to_s
忽略第三种情况下的*
?如果这有任何不同,我正在运行Ruby 1.9.2。
答案 0 :(得分:7)
正如Namida已经提到的那样,Ruby解释
2.to_s *2
作为
2.to_s(*2)
因为方法调用中的括号在Ruby中是可选的。这里的星号是所谓的splat operator。
这里唯一令人费解的问题是为什么*2
评估为2
。当您在方法调用之外使用它时,splat运算符会将所有内容强制转换为数组,以便
a = *2
会导致a
为[2]
。在方法调用中,splat运算符正在执行相反的操作:将任何内容解包为一系列方法参数。传递一个三元素数组,它将作为三个方法参数。传递标量值,它将作为单个参数转发。所以,
2.to_s *2
与
基本相同2.to_s(2)
答案 1 :(得分:0)
在第三行中,您使用" splat"来调用to_s
方法。 2,计算结果为2(在方法调用中),因此返回number in a different base。