如果我运行以下代码,前两行会返回我所期望的结果。然而,第三个返回 2 的二进制表示。
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
我知道在调用 to_s
时传入 2 会将我的输出转换为二进制,但为什么 to_s
忽略第三个中的 *
案件?如果有任何不同,我正在运行 Ruby 1.9.2。
最佳答案
对,正如 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)
关于Ruby to_s 转换为二进制(参数中的 Splat 运算符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12669323/