这段代码似乎创建了一个范围从 a 到 z 的数组,但我不明白它的*
作用。有人可以解释一下吗?
[*"a".."z"]
它被称为splat 运算符。
喷出左值
最多可以喷出一个左值,在这种情况下,它被分配一个数组,该数组由缺少相应左值的剩余右值组成。如果最右边的左值被喷溅,那么它会消耗所有尚未与左值配对的右值。如果 splatted 左值后面跟着其他左值,它会消耗尽可能多的右值,同时仍然允许后面的左值接收它们的右值。
*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
空溅
一个左值可以由一个星号(U+002A)组成,没有任何相关的标识符。它的行为如上所述,但不是将相应的右值分配给喷溅的左值,而是丢弃它们。
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
splat 运算符将范围扩展为一个数组。
呵呵,有趣的事实。当你这样做时:
*(0..50)
你得到一个错误。
在这种情况下,splat 运算符需要接收器才能工作。因此,不要在没有接收器的情况下尝试它,从而欺骗自己认为它在 irb 中坏了。