本の非常に良い説明:Rubyプログラミング言語
4.5.5.6. 並列代入における括弧
並列代入の最も理解されていない機能の 1 つは、左辺で「部分代入」に括弧を使用できることです。2 つ以上の左辺値のグループが括弧で囲まれている場合、最初は単一の左辺値として扱われます。対応する右辺値が決定されると、並列割り当てのルールが再帰的に適用されます。つまり、その右辺値は、括弧内の左辺値のグループに割り当てられます。次の割り当てを検討してください。
x,(y,z) = a, b
これは事実上、同時に実行される 2 つの割り当てです。
x = a
y,z = b
ただし、2 番目の割り当て自体が並列割り当てであることに注意してください。左側に括弧を使用したため、再帰的な並列代入が実行されます。それが機能するためには、 b は配列や列挙子などのスプラッタブル オブジェクトでなければなりません。
これをより明確にするためのいくつかの具体的な例を次に示します。左側の括弧は、右側のネストされた配列の 1 つのレベルを「アンパック」するように機能することに注意してください。
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
2 番目の混乱:
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