MogLog

メモというか日記というか備忘録というか

【Ruby】多重代入

多重代入
多重代入とは、左辺か右辺またはその両方が複数個ある代入式のこと。

(1) 左辺と右辺が同数
最も単純な多重代入。
このケースの場合、最初の左辺が最初の右辺、2番めの左辺が2番めの右辺、といったように順に代入される。
ただし、これらの代入は逐次的にではなく、並行して実行されることに注意したい。

x,y,z = 1,2,3 # x=1, y=2, z=3

# 以下の2行は同じ意味にはならない
x,y = y,x # 並行:2つの変数の値を交換する
x = y; y = x # 逐次的i:両方の変数が同じ事になる


(2) 1個の左辺、複数の右辺
左辺が1つで、右辺が複数個ある場合、Rubyは右辺を保持する配列を作り、その配列を左辺に代入する。
複数の右辺が1つの配列にけつごうされることを防ぎたければ、左辺の後ろにカンマを付ける。

1 = 1,2,3 # x = [1,2,3]
x, = 1, 2, 3 # x = 1。他の値は捨てられる


(3) 複数の左辺、1個の配列の右辺
このケースの場合、Rubyはその右辺を代入すべき値のリストに展開しようとする。
右辺が配列なら、Rubyは配列を展開し、個々の要素が独自の右辺になるようにする。
右辺が配列でなくても、to_aryメソッドを実装する場合は、to_aryを呼び出して配列を作ってから、その配列を展開して代入する。

x,y,z = [1,2,3] # x,y,z = 1,2,3と同じ


(4) 左辺と右辺の数がことなる場合
左辺のほうが右辺よりも数が多く、「*」が使われていない場合には、最初の右辺が最初の左辺、次の右辺が次の左辺、といったように代入され、右辺がなくなるまで続く。余った左辺には、nilが代入される。

右辺のほうが左辺よりも数が多く、「*」が使われていない場合には、個々の左辺に順番に右辺が代入され、余った右辺は捨てられる。

x,y,z = 1,2 # x=1, y=2, z=nil
x,y = 1,2,3 # x=1, y=2, 3は代入されない


(5) 多重代入における「*」
右辺の前にアスタリスクがつけられていれば、それはその値が配列であり、その個々の要素を右辺にすべきことを表している。右辺の配列、範囲、ハッシュは「*」で展開することができる。一般にto_aメソッドを定義している右辺にはプレフィクスとして「*」をつけることができる。

左辺の前にアスタリスクがつけられている場合には、余っている全ての右辺を配列にまとめて、その左辺に代入するという意味になる。左辺に代入される値は必ず配列であって、要素は0個以上の適切な個数になる。

x,y,z = 1, *[2,3] # x,y,z = 1,2,3と同じ
x,*y = 1,2,3 # x=1, y=[2,3]
x,*y = 1,2 # x=1, y=[2]
x,*y = 1 # x=1, y=[]
x,y,*z = 1, *[2,3,4] # x=1, y=2, z=[3,4]