Rubyでは変数に代入を行う際に、右辺と左辺の式をカンマで区切ってやると、複数の変数への代入を1行で記述できる。 これは多重代入と呼ばれており、多重代入を使うことで変数の初期化を簡潔に書くことができる。 以下は変数a
とb
を、それぞれ1と2で初期化する例である。
a, b = 1, 2 #=> a = 1, b = 2
多重代入では右辺の式を配列にすることもできる。
a, b = [1, 2] #=> a = 1, b = 2
右辺の要素が余ったら無視される。逆に足りなければnilが代入される。
a, b = 1, 2, 3 #=> a = 1, b = 2
a, b, c = 1, 2 #=> a = 1, b = 2, c = nil
ただし、左辺で*
をつけた変数を指定すると、その変数には配列が代入される。 配列には右辺で余った要素がすべて詰め込まれる。 右辺に余った要素がなければ空の配列となる。
a, *b = 1, 2 #=> a = 1, b = [2]
a, *b = 1, 2, 3 #=> a = 1, b = [2, 3]
a, *b = 1 #=> a = 1, b = []
括弧を使ってネストした配列を代入することもできる。
(a, b), c = [1, 2], 3 #=> a = 1, b = 2, c = 3
Rubyの多重代入を使うと、変数の値の交換を以下のように書ける。
a, b = b, a
もし式が逐次的にa = b
、b = a
と評価されていると考えると、この記述ができるのは不可解だ。 実際Rubyの多重代入は、このような逐次的な代入は行わず、右辺を評価した結果をまとめて左辺に代入する挙動をするようだ。