2013-11-24 72 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。 –