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

sla*_*ote 6 ruby splat ruby-1.9.2

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

2.to_s      # => "2"
2.to_s * 2  # => "22"
2.to_s *2   # => "10" 
Run Code Online (Sandbox Code Playgroud)

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

Mla*_*vić 7

正如Namida已经提到的那样,Ruby解释道

2.to_s *2
Run Code Online (Sandbox Code Playgroud)

2.to_s(*2)
Run Code Online (Sandbox Code Playgroud)

因为方法调用中的括号在Ruby中是可选的.这里的星号是所谓的splat运算符.

这里唯一令人费解的问题是为什么要*2评估2.当你在方法调用之外使用它时,splat操作符将所有内容强制转换为数组,这样就可以了

a = *2
Run Code Online (Sandbox Code Playgroud)

将导致与a[2].在方法调用中,splat运算符正在执行相反的操作:将任何内容解包为一系列方法参数.传递一个三元素数组,它将作为三个方法参数.传递标量值,它将作为单个参数转发.所以,

2.to_s *2
Run Code Online (Sandbox Code Playgroud)

与...基本相同

2.to_s(2)
Run Code Online (Sandbox Code Playgroud)