ruby中的嵌套赋值

ruby中的嵌套赋值,ruby,nested,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个Arumings和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

为什么会发生这些任务

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个Arumings和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 

书中的解释很好:

4.5.5.6。平行赋值中的括号

平行赋值的一个最不为人所知的特征是,左边可以使用括号来表示“子赋值”。如果两个或更多左值的一组被括在括号中,则最初将其视为单个左值。一旦确定了相应的右值,并行赋值规则递归应用,将右值赋值给括号中的左值组。考虑以下任务:

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 = 1
(b,c) = [2,3]
d = 4
第二个困惑:

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
d = 3
a = 1
(b,c) = [2,3]
d = 4

@我今天也从你的问题中学到了一些新东西。我也很高兴……)