字符串文字前面的*在红宝石中做了什么?

时间:2010-10-27 08:09:55

标签: ruby splat

此代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?

[*"a".."z"]

3 个答案:

答案 0 :(得分:12)

它被称为splat operator

  

涂上左值

     

最多可以喷出一个左值,在这种情况下,它被分配一个由缺少相应左值的剩余右值组成的数组。如果最右边的左值被喷溅,那么它将消耗所有尚未与左值配对的右值。如果splatted左值跟随其他左值,它会消耗尽可能多的rvalues,同时仍然允许以下左值接收它们的rvalues。

*a = 1
a #=> [1]

a, *b = 1, 2, 3, 4
a #=> 1
b #=> [2, 3, 4]

a, *b, c = 1, 2, 3, 4
a #=> 1
b #=> [2, 3]
c #=> 4
     

Empty Splat

     

左值可以由唯一的星号(U + 002A)组成,没有任何相关的标识符。它的行为如上所述,但不是将相应的rvalues分配给splatted左值,而是丢弃它们。

a, *, b = *(1..5)
a #=> 1
b #=> 5
     

涂上右值

     

当一个rvalue被splatted时,它将被转换为一个带有Kernel.Array()的数组,其元素本身就变成了rvalues。

a, b = *1
a #=> 1
b #=> nil

a, b = *[1, 2]
a #=> 1
b #=> 2

a, b, c = *(1..2), 3
a #=> 1
b #=> 2
c #=> 3

答案 1 :(得分:0)

splat运算符将范围扩展为数组。

答案 2 :(得分:0)

嗯,好玩的事实。当你这样做时:

*(0..50)

你得到一个错误。

在这种情况下,splat操作符需要接收器才能工作。因此,不要仅仅在没有接收器的情况下尝试它,就不要自欺欺人地认为它已经破碎了。