これが「並行課題」です。
Ruby での並列代入は、複数の左辺値 (つまり、等号の左側の値) および/または複数の右辺値 (等号の右側の値) がある場合に発生します。
並列代入を理解するには、考慮すべきさまざまなケースがあります。
ケース #1: 左側に 1 つの値、右側に複数の値
最初の最も単純なケースは、1 つの左辺値と複数の右辺値がある場合です。例えば:
> a = 1, 2
> a
=> [1, 2]
起こっていることは、右側のコンマ区切りの値のリストが配列に変換され、左側の変数に割り当てられることだけです。
ケース #2: 左側に複数の値、右側に同じ数の値
2 番目のケースは、左辺値と右辺値の数が同じ場合です。例えば:
> a,b = 'foo', 'bar'
> a
=> "foo"
> b
=> "bar"
これも非常に簡単です。右側の各項目を評価し、左側の対応する変数に順番に割り当てるだけです。
ケース #3: 左側に複数の値、右側に 1 つの値 -- ただし配列です
3 番目のケースは、右辺値が配列であり、その配列の要素が複数の左辺値に分散 (または「展開」) されている場合です。例えば:
> a, b = ['foo', 'bar']
> a
=> "foo"
> b
=> "bar"
これは、配列構文を明示的に使用する場合を除いて、上記のケース #2 と事実上同じです。
ケース #4: 右側よりも左側の値が多い
4 番目のケースは、両側に複数の値があり、右辺値よりも左辺値の方が多い場合です。例えば:
> a, b, c = 'foo', 'bar' # Note only 2 values on the right
> a
=> 'foo'
> b
=> 'bar'
> c
=> nil
ご覧のとおり、Ruby は値を分散するために最善を尽くしましたが、それらが不足nil
し、左側の最後の変数に代入することを余儀なくされました。
ケース #5: 左側よりも右側の値が多い
5 番目のケースは、両側に複数の値があり、左辺値が右辺値よりも少ない場合です。例えば:
> a, b = 'foo', 'bar', 'baz' # Note only 2 values on the left
> a
=> 'foo'
> b
=> 'bar'
繰り返しになりますが、Ruby は値を分配するために最善を尽くしましたが、あまりにも多くの値を分割できなかったため、最も右側の値 (「baz」) をイーサに送信することを余儀なくされました。
ケース #6+: スプラッティング
上記の場合、最後の値を失ったことに注意してください。ただし、実際には、「splat」演算子と呼ばれる関連演算子 (変数の前にあるアスタリスクで構成されます) を使用して、そのような余分な値をキャプチャして配列にまとめることができます*my_var
。この「splat」演算子を使用して多くの便利なことを行うことができますが、この回答が過負荷にならないように、他の場所に行って実際の例を確認することをお勧めします。たとえば、このブログ投稿には、いくつかのバリアントの使用法がリストされています。
注: temp 変数を使用しないスワップ
この並列割り当て機能の優れた点の 1 つは、値を簡単に交換できることです。
並列割り当てなしで値を交換するには、次のように記述します。
> a = 'foo'
> b = 'bar'
> temp = a # Introduce a temp variable
> a = b
> b = temp
> a
=> "bar"
> b
=> "foo"
しかし、並列割り当てを使用すると、Ruby に頼って暗黙的にスワッピングを処理することができます。
> a = 'foo'
> b = 'bar'
> b, a = a, b
> a
=> "bar"
> b
=> "foo"