2013-09-29 155 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我还了解到今天从你的问题新的东西。我也很高兴.. :) –