我想看看splat操作符是如何在Ruby中处理range的为此,请在我的IRB中运行以下代码:

*a = (1..8)
#=> 1..8

当上面的情况好的时候,下面发生了什么意思是为什么a给出[]
*a,b = (1..8)
#=> 1..8
b
#=> 1..8
a
#=> []

意思是为什么b给出[]?
a,*b = (1..8)
#=> 1..8
a
#=> 1..8
b
#=> []

在下面的Rvalues中发生了什么优先级?
 a,*b = *(2..8),*3,*5
# => [2, 3, 4, 5, 6, 7, 8, 3, 5]
 b
# => [3, 4, 5, 6, 7, 8, 3, 5]
 a
# => 2

这里是splat运算符的另一个尝试(*):-
虽然我知道在并行分配中我们不能使用多个splated变量,但是当splat与Rvalues一起使用时,为什么不一样呢?
 *a,*b = [1,2,3,4,5]
SyntaxError: (irb):1: syntax error, unexpected tSTAR
*a,*b = [1,2,3,4,5]
    ^
    from /usr/bin/irb:12:in `<main>'

上述情况如预期。
 a = *2,*3,*5
#=> [2, 3, 5]

但不能理解上面的内容。

最佳答案

我认为并行赋值是将一个变量数组设置为另一个具有模式匹配的数组。
一点是,在将范围转换为数组或splat之前,它是一个单独的值。例如[1..5]这是一个范围1..5而不是[1,2,3,4,5]的单元素数组。要获取int数组,您需要执行(1..5).to_a[*(1..5)]
我认为第一个是最棘手的如果飞溅的变量分配给一个元素,则该变量本身必须是一个元素数组:

*a = 5
a
# => [ 5 ]

对于接下来的两个,splat将0个或更多尚未分配的值带入一个数组。因此,以下几点是有道理的:
*a, b = (1..8)

就像
*a, b = "hey"

就像
*a, b = [ "hey" ]

因此*a[]并且b"hey"并且根据相同的逻辑,如果*a什么都不是,a必须是一个空数组同样的想法
a, *b = (1..5)

对于下一个,范围是飞溅的,所以这个赋值又很有意义:
[*(2..4), 9, 5]
# => [2, 3, 4, 9, 5]

再次用splat进行并行分配下一个类似:
[*3, *4, *5]
# => [3, 4, 5]

所以这就像
a = 3, 4, 5

就像
a = [3, 4, 5]

关于ruby - 与splat运算符和Ruby中的Range混淆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15034110/

10-09 01:53