Rubyの多重代入について
タグ: ruby / 初版公開: 2014-03-05

Rubyでは変数に代入を行う際に、右辺と左辺の式をカンマで区切ってやると、複数の変数への代入を1行で記述できる。 これは多重代入と呼ばれており、多重代入を使うことで変数の初期化を簡潔に書くことができる。 以下は変数abを、それぞれ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 = bb = aと評価されていると考えると、この記述ができるのは不可解だ。 実際Rubyの多重代入は、このような逐次的な代入は行わず、右辺を評価した結果をまとめて左辺に代入する挙動をするようだ。