6

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

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

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

4

2 回答 2

7

对,正如 Nanoda 已经提到的,Ruby 解释

2.to_s *2

作为

2.to_s(*2)

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

这里唯一令人费解的问题是为什么*2评估为2. 当您在方法调用之外使用它时,splat 运算符将所有内容强制转换为数组,以便

a = *2

会导致abeing [2]。在方法调用中,splat 运算符的作用正好相反:将任何东西解包为一系列方法参数。向它传递一个三成员数组,它将作为三个方法参数的结果。传递一个标量值,它将作为单个参数转发。所以,

2.to_s *2

本质上是一样的

2.to_s(2)
于 2012-10-01T08:02:58.473 回答
0

在第三行中,您使用to_s“splat”为 2 调用方法,其计算结果为 2(在方法调用中),因此返回不同 base 中的数字

于 2012-10-01T08:06:21.830 回答