2013-11-24 67 views
3

我最近遇到的图示操作的这个例子:不止一次在一边

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

和它的工作。

所以我想知道,你可以在左边还是右边多次使用摔跤运算符?每次我这样做,我都会收到意想不到的明星错误,但只是想知道它的问题。

回答

4

在左侧不能有多个图示。 (至少不在同一层次的嵌套。)毕竟,它意味着“吞噬所有值”,那么两个splats甚至意味着什么?这只是没有意义。

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

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

两个泼溅在不同层次的嵌套,他们不互相干扰。

而就在右手边,有没有问题或者:

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

这只是意味着扩张,而且也没有在右手边扩大多个阵列的问题。

+0

*这样的事*我不知道怎么红宝石调用它,但在其他语言中,它被称为“模式匹配”。我在回答中写了一些关于它的信息(并将链接)。 –

+1

@DarekNędza:Ruby称之为*并行赋值*,它是一种*解构绑定*形式。模式匹配比简单的解构绑定更*强大。 –

+1

* bind *表示什么? –

0

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

但是你可以多次使用图示运营商更多,如果你使用模式匹配(!)(不知道是否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 

正如你可以看到我用图示运营商b和C变量。这种情况下的括号是前面提到的模式匹配。 Here你可以读一点关于这个。

总结无模式匹配())您可以使用它一次。
随着模式匹配,你可以一次使用它每()(模式匹配)

PS。 **[1,2,3]不能用作分配,所以你可以用它几次:

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

什么语言称为模式匹配? –

+0

@ the-tin-man例如,haskell。 –