Ruby to_s转换为二进制(参数中的Splat运算符)

时间:2012-10-01 07:51:29

标签: ruby ruby-1.9.2 splat

如果我运行以下代码,前两行将返回我期望的内容。但是,第三个返回2的二进制表示。

2.to_s      # => "2"
2.to_s * 2  # => "22"
2.to_s *2   # => "10" 

我知道在调用to_s时传入2会将我的输出转换为二进制,但为什么to_s忽略第三种情况下的*?如果这有任何不同,我正在运行Ruby 1.9.2。

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