ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

Ruby - 多重代入

一般に代入を行うときはa = 1というように一つの変数に代入することがほとんどであるが、変数への代入を複数まとめて行うことも可能で、これを多重代入と呼ぶ。

基本的な多重代入

a = 1
b = 2
c = 3

以上の代入を多重代入に書き直すと、

a, b, c = 1, 2, 3

というようになる。ただ、闇雲に一行で書けて楽だ〜といって多重代入を使うよりは、変数の使いドコロが似ている(関連性のある)ものをまとめて、多重代入をすることが必要だと思われる。

いろいろな多重代入

多重代入で配列を代入したい

配列で格納したい変数名の前に*(アスタリスク)を付けると、その変数より後ろの値が配列形式で代入される(該当する値がない場合はnilが代入される)。

a, b, *c = 1, 2, 3.0, 3.2, 3.4, 3.6, 3.8
#=> [1, 2, [3.0, 3.2, 3.4, 3.6, 3.8]]

変数の値を入れ替える

変数の入れ替えでよく使われるスニペット

a, b = 1, 0
tmp = a
a = b
b = tmp

という一時退避のtmpを使ったものがあるが、Rubyではすっきりと書ける。

a, b = 1, 0
a, b = b, a
p a, b    #=> [0, 1]

配列の要素を変数に落としこむ

以下のように書くと、

array = [1, 2, 3]
a, b, c = array

配列の各要素を左辺の変数に落とし込んでくれる。

p a    #=> 1
p b    #=> 2
p c    #=> 3

先頭だけ取り出したいときは、先頭を格納したい変数の後ろに,(カンマ)を付けると、先頭要素を代入してくれる。

array = [1, 2, 3, 4, 5]
a, = array
p a    #=> 1

複数の戻り値を返し, 受け取りたい

多重代入の使いどころの一つとして、戻り値に多重代入を利用することがある。

def calc(num1, num2)
    values = Array.new
    values.push(num1 + num2)
    values.push(num1 - num2)
    values.push(num1 * num2)
    values.push(num1 / num2)

    return values
end

add, sub, multi, div = calc(10, 2)

puts "加算:#{add}, 減算:#{sub}, 掛算:#{multi}, 割算:#{div}"
加算:12, 減算:8, 掛算:20, 割算:5

加算, 減算, 掛算, 割算を一気に行うメソッド(これが適当かはどうか別として)があったとして、4つの計算結果を一気に戻り値として戻したい場合に配列として渡す。

受け取り側は、戻り値に対応する任意の変数で受け取ることで、複数の戻り値を受け取れている。

参考

www.rubylife.jp

たのしいRuby 第5版

たのしいRuby 第5版

Rubyの多重代入について -- ぺけみさお