プログラムはできるだけシンプルに分かりやすく記述することで、バグや認識違いを少なくすることができます。
Rubyの多重代入は、プログラムをシンプルに記述することができる手法の1つです。
本記事では、Rubyの多重代入について解説します。
記事内に記載しているプログラムは、Ruby2.7.1を使って動作確認をしています。
Rubyの多重代入
Rubyの多重代入について、以下の内容を解説します。
- 基本的な多重代入
- 配列を含む多重代入
- ハッシュの多重代入
基本的な多重代入
多重代入は、複数の式または配列から同時に代入を行います。
メソッドが戻り値を配列で返す場合などに、意味のある変数として多重代入を行うと、プログラムをシンプルで分かりやすくすることができます。
基本となる、一番シンプルな例が以下のプログラムです。
a, b = 1, 2 p a # -> 1 p b # -> 2
上記のプログラムでは、左辺に2つの変数、右辺に2つの値を並べて記述しています。
変数aとbにそれぞれ右辺に並べた順番に1と2が同時に代入されます。
左辺の方が要素が多い場合は、はみ出た要素にnilが代入されます。
a, b, c = 1, 2 p a # -> 1 p b # -> 2 p c # -> nil
右辺の方が要素が多い場合は、はみ出た要素が無視されます。
a, b = 1, 2, 3 p a # -> 1 p b # -> 2
右辺の方が要素が多い場合に、はみ出た要素も含めてすべて取得するには、最後の変数に*を付けます。
*を付けた変数には、配列で代入されます。
a, *b = 1, 2, 3 p a # -> 1 p b # -> [2, 3]
*を付けても左辺の方が多い場合は、空の配列が代入されます。
a, *b = 1 p a # -> 1 p b # -> []
先頭の値のみを代入する場合は、最後にカンマを付けます。
a, = 1, 2 p a # -> 1
末尾の値のみを代入する場合は、*で末尾以外の値を捨てて、最後に代入先の変数を指定します。
*, b = 1, 2 p b # -> 2
先頭と末尾の値を取得する場合は、中間の値を*として捨てます。
a, *, b = 1, 2, 3, 4 p a # -> 1 p b # -> 4
2番目と3番目の値を取得する場合は、先頭の変数にアンダースコアで最初の値を捨てて、その後に代入したい変数を指定します。
_, a, b, = 1, 2, 3, 4 p a # -> 2 p b # -> 3
配列を含む多重代入
値に配列が指定された場合は、展開されてそれぞれの変数に代入されます。
配列の要素数が変数に比べて少ない場合や多い場合の挙動は、上述の配列でない多重代入の動作と同じです。
a, b = [1, 2] p a # -> 1 p b # -> 2
配列と値が混在する場合は、配列と値で分割されます。
a, b = [1, 2], 3 p a # -> [1, 2] p b # -> 3
上記の混在時に、配列を展開させたい場合は、配列に*を付けます。
a, b = *[1, 2], 3 p a # -> 1 p b # -> 2
空の配列が混在している場合も、1つの要素としてそのまま代入されます。
a, b = [], 1, 2 p a # -> [] p b # -> 1
上記の空の配列が混在している時に、空の配列を無視させたい場合は、*を付けます。
a, b = *[], 1, 2 p a # -> 1 p b # -> 2
二重配列は、外側の配列に対する要素がそれぞれ代入されます。
a, b = [[1, 2], [3, 4]] p a # -> [1, 2] p b # -> [3, 4]
上記の場合は、*を付けても結果は同じになります。
a, b = *[[1, 2], [3, 4]] p a # -> [1, 2] p b # -> [3, 4]
二重配列とそうでない値が混在している場合は、二重配列が1つの要素として代入されます。
a, b = [[1, 2], [3, 4]], 5, 6 p a # -> [[1, 2], [3, 4]] p b # -> 5
上記の混在時に、外側の配列を展開させるには、*を付けます。
a, b = *[[1, 2], [3, 4]], 5, 6 p a # -> [1, 2] p b # -> [3, 4]
配列とそうでない値が混在している場合に、変数側でカッコを付けることで、ネストする配列をそれぞれの変数に展開することができます。
a, (b, c) = 1, [2, 3] p a # -> 1 p b # -> 2 p c # -> 3
ハッシュの多重代入
ハッシュはそれ自体を1要素として扱います。
a, b = {x: 1, y: 2} p a # -> {:x=>1, :y=>2} p b # -> nil
ハッシュの要素を展開させるには、*を付けます。
a, b = *{x: 1, y: 2} p a # -> [:x, 1] p b # -> [:y, 2]
ハッシュの要素の値のみを取得したい場合は、values_atを使います。
a, b = {x: 1, y: 2}.values_at(:x, :y) p a # -> 1 p b # -> 2
まとめ
Rubyの多重代入についてまとめると以下となります。
- 多重代入は、右辺にある複数の式または配列から、左辺の変数へ同時に代入を行う。
- 意味のあるまとまりで多重代入を用いると、プログラムがシンプルで分かりやすくなる。
- 配列やハッシュなどが混在している場合でも、展開させて代入することができる。
分かりやすいプログラムを作る一つの手段として、使ってみてはいかがでしょうか。
今回は、Rubyの多重代入を解説しました。
以上、参考になれば幸いです。
コメント