2013-09-29 190 views
2

爲什麼這些賦值發生?紅寶石嵌套賦值

a,(b,c),d = 1,2,3,4 # a=1, b=2,c=nil, d=3 

爲什麼是d = 3和c = nil?

還在此

a,(b,c),d = 1,[2,3],4 # a=1, b=2,c=3, d=4 

C = 3和d = 4?

這是確定的,因爲它的2個arugments VS 3倍的值

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

,這似乎是合乎邏輯的,因爲用圖示的

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

回答

6

在這本書很好的解釋:The Ruby Programming Language

4.5.5.6。在平行分配

之一平行分配的至少理解的特徵括號是左側的可以使用括號爲「subassignment。」 如果一組兩個或更多的左值的括在括號中,然後將其最初被視爲一個單一的左值。一旦確定了相應的右值,遞歸應用並行賦值規則 - 即將右值賦給括號中的左值組。考慮以下分配:

x,(y,z) = a, b 

這實際上是在同一時間執行兩個賦值:

x = a 
y,z = b 

但需要注意的是,第二分配本身就是一種並行任務。因爲我們在左側使用括號,所以執行遞歸併行分配。爲了使它工作,b必須是一個可噴濺的對象,如數組或枚舉器。

下面是一些應該使這個更清楚的具體例子。請注意,在左邊的行爲,以括號「解壓」嵌套數組的一個水平上的權利:

x,y,z = 1,[2,3]    # No parens: x=1;y=[2,3];z=nil 
x,(y,z) = 1,[2,3]   # Parens: x=1;y=2;z=3 

a,b,c,d = [1,[2,[3,4]]]  # No parens: a=1;b=[2,[3,4]];c=d=nil 
a,(b,(c,d)) = [1,[2,[3,4]]] # Parens: a=1;b=2;c=3;d=4 

現在來到你的第一個困惑:

A,(B,C) ,d = 1,2,3,4#a = 1,b = 2,c =零,d = 3

爲什麼d = 3和c = nil?

這是因爲a,(b,c),d = 1,2,3,4是如下實際:

a = 1 
(b,c) = 2 
d = 3 

二混亂:

一個,(B,C)中,d = 1,[2,3],4 #a = 1,b = 2,c = 3,d = 4

c = 3和d =

這是因爲a,(b,c),d = 1,[2,3],4是如下實際:

a = 1 
(b,c) = [2,3] 
d = 4 
+1

非常好的,非常感謝 –

+2

@NickGinanto我還了解到今天從你的問題新的東西。我也很高興.. :) –