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.
正如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)