ruby中的嵌套赋值

时间:2013-09-29 18:55:37

标签: ruby nested

为什么要进行这些任务?

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 

这似乎是合乎逻辑的,因为它带有splat

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

1 个答案:

答案 0 :(得分:6)

书中非常好的解释:The Ruby Programming Language

<强> 4.5.5.6。并行分配的括号

并行分配最不被理解的特征之一是左侧可以使用括号进行“子分配”。 如果括号中包含两个或更多个左值的组,则最初将其处理作为单个左值。 一旦确定了相应的rvalue,就会递归地应用并行赋值规则 - 将rvalue分配给括号中的左值组。请考虑以下任务:

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 = nil,d = 3

     

为什么d = 3且c = nil?

这是因为a,(b,c),d = 1,2,3,4实际上如下:

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

第二个困惑:

  

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

     

c = 3且d = 4?

这是因为a,(b,c),d = 1,[2,3],4实际上如下:

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