3

こんにちは、StackOverflow クルーです。

私たちはいくつかのRubyをやっていますが、理解するのが難しいと思われる例が現れました:

a=5
b=4
a,b=a+b,a

=> [9,5]
=> a=9
=> b=5

どうして?そこで何が起こっているのですか?「a、b、a」が機能していて、機能していないのはなぜですか? 「b」が 5 になり、「a」が 9 になるのはなぜですか?

ちょうど書くと

a,b=a+b

=> 9
=> a=9
=> b=nil

バージョン 2.5 で修正される予定の Ruby のエラーの一種であると推測しています。または、まだ見えていないいくつかの基本的な法律が実装されている可能性があります。

皆さん、私たちを助けてくれませんか?

コード例は、スタンフォード Ruby コースのクイズ問題の一部です。彼らは、私たちが行き詰まったときに StackOverflow の天才に尋ねるように私たちに言いました。

4

4 に答える 4

5

Rubyの間違いではなく、並列代入演算子の使用法を誤解しているようです。

前者と後者の例は大きく異なります。それらをまとめましょう:

a,b=a+b,a
a,b=a+b

そして今、いくつかの空白を追加します

a,b =  a+b, a
a,b =  a+b

最初の式は の左辺と右辺の並列代入でa, bありa+b , a、後者は の左辺と右辺の並列代入a, bですa+b。RHS の違いに注意してください。

これらの 2 つは次のようになります。

(1)

a =  a+b
b =  a'   **

(2)

a =  a+b
b =  nil

ただし、すべてが 1 つの操作であることに注意してください。したがって、(1) の場合、A ではなく A です。元の並列代入が 2 つの操作ではなく 1 つの操作であるため、割り当てられたばかりの 'a+b' の値ではなく、'a' の OLD VALUE が使用されます。説明のためにここで分解したように。

この意味は:

a,b = a+b, a

s1=a+b計算され、s2=a計算され、そしてa=s1; b=s2;「1回の操作」で発生します。

単一の代入を実行して単一の値が返される場合とは対照的に、1 つの操作であり、2 つの値に割り当てるため、2 つの要素の配列が返されます。

トリプル割り当てを実行する場合:

a,b,c,d,e,f  = 0,1,2,3,4,5

[0,1,2,3,4,5] の配列が結果になり、a/b/c/d/e/f にはそれぞれ 0/1/2/3/4/5 の値が割り当てられます。

詳細については、並列代入に関する Ruby のドキュメントを参照してください。また、配列の展開とパラメーターのグループ化に使用される * 演算子も参照してください。

于 2013-03-07T16:11:42.333 に答える
4

演算子を使用すると、=コンマを使用して複数の値を「並行して」割り当てることができます。

例えば:

a,b=1,2

a1に割り当てbます2

同じく、

a,b=a+b,a

これは次のとおりですa=5b=4

a,b=5+4,5

それは次のとおりです。

a,b=9,5

したがって、a9 とb5 が割り当てられます。

于 2013-03-07T16:10:21.510 に答える
2

値を代入すると、より理にかなっている場合があります。

a = 5
b = 4
a, b = a + b, a
a, b = [5 + 4], 5
a, b = [9, 5]

a, b = [a + b]
a, b = [a + b], nil # implicit nil
a, b = [5 + 4], nil

並列代入は、右側を配列に代入してから、変数をその順序で配列内のそのインデックスを持つ項目に代入することと同じです。

2 番目の例に暗黙的な nil がある理由は、存在しない配列インデックスに対する ruby​​ ルックアップの方法にあります。

array = []
array[0] # nil
于 2013-03-07T16:12:00.803 に答える
2

これは、最初の例で の値を のb値と等しくなるように設定しているためです。a

a = 5
b = 4
a,b=a+b,a

そうa=5+4 そして b=5

于 2013-03-07T16:12:33.957 に答える