在Ruby中并行赋值中使用splat运算符不止一次

时间:2013-11-24 13:19:46

标签: ruby

我最近遇到了splat运算符的这个例子:

first, *, last = 1, 2, *[3,4,5]

并且有效。

所以我想知道,你能不能在左侧或右侧多次使用splat运算符?每次我这样做时都会出现意想不到的明星错误,但只是想知道它是什么。

2 个答案:

答案 0 :(得分:4)

左侧不能有多个啪啪声。 (至少不是在相同的嵌套级别。)毕竟,这意味着“吞噬所有的价值”,那么两个splats甚至意味着什么?它没有意义。

注意:这样的事情当然是可能的:

a, *b, (c, *d) = [1, 2, 3, [4, 5, 6]]

两个splats处于不同的嵌套层次,它们不会相互干扰。

在右侧,也没有问题:

a = 1, 2, *[3, 4], *[5, 6]

它只是意味着扩展,并且在右侧扩展多个阵列没有问题。

答案 1 :(得分:0)

在一侧(左侧或右侧),您只能使用splat(* 一次。 first, *, last - >这里有一个* 1,2,* [3,4,5] - >在这里,它是相同的

然而(!)如果你使用模式匹配你可以多次使用splat运算符(不确定ruby是否会这样调用它,但是在其他语言中这样调用类似的功能,所以我将使用这个术语):

 a, *b, (*c, d) = 1, 2, 4, 5, 6, [7, 8, 9, 10, 11]
#=> [1, 2, 4, 5, 6, [7, 8, 9, 10, 11]]
 a
#=> 1
 b
# => [2, 4, 5, 6]
 c
# => [7, 8, 9, 10]
 d
# 11

正如您所看到的,我使用splat运算符和b和c变量。在这种情况下,括号是前面提到的模式匹配。 Here你可以读一点这个。

总结一下,如果没有模式匹配()),您可以使用一次。
使用模式匹配,您可以使用 ()(模式匹配)

PS。 *中的*[1,2,3]未用作作业,因此您可以使用它几次:

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