Rubyの多重代入

プログラミング

プログラムはできるだけシンプルに分かりやすく記述することで、バグや認識違いを少なくすることができます。

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の多重代入を解説しました。

以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました