为什么要进行这些任务?
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
答案 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