🌊
[Bug #20858] 複数の変数、値の代入式での挙動に関するチケット
[Bug #20858] multiple parallel assignments are inconsistent
- 次のように1行に複数の代入式がある場合は右辺の値がそれぞれの変数に代入されます
a = b = c = 1
pp a:, b:, c:
# => {:a=>1, :b=>1, :c=>1}
- 同じく次のように『左辺と右辺に複数の変数や値がある場合』にはそれぞれ別々の変数に値が代入されます
a, b = 1, 2
pp a:, b:
# => {:a=>1, :b=>2}
- 上記を前提としたときに次のように『複合的な代入式』の場合に意図する挙動にならないというチケットになります
a, b = c, d = 3, 4
pp a:, b:, c:, d:
# => ???
- これなんですが実際に動かしてみると
undefined local variable or method
c' for main (NameError)` とエラーになります - なので次のように事前に
a ~ d
の変数を定義しておくと次のような結果になります
a = b = c = d = "hoge"
a, b = c, d = 3, 4
pp a:, b:, c:, d:
# => {:a=>"hoge", :b=>3, :c=>"hoge", :d=>3}
- これなんですが現状の Ruby では
a, b = c, (d = 3), 4
のように解釈されるためです
a = b = c = d = "hoge"
# これと同じ結果になる
# a, b = [c, (d = 3), 4] みたいに解釈するとわかりやすいかも
a, b = c, (d = 3), 4
pp a:, b:, c:, d:
# => {:a=>"hoge", :b=>3, :c=>"hoge", :d=>3}
- コメントでは
a, b = c, (d = 3, 4)
と解釈されると書いてあるんですがこっちだと結果が異なるのでちょっと違ってそうかも
a = b = c = d = "hoge"
a, b = c, (d = 3, 4)
pp a:, b:, c:, d:
# => {:a=>"hoge", :b=>[3, 4], :c=>"hoge", :d=>[3, 4]}
-
a = c = 3
b = d = 4
みたいな挙動になってほしい場合は以下のようなカッコをつけることで期待する代入になります
a, b = (c, d = 3, 4)
pp a:, b:, c:, d:
# => {:a=>3, :b=>4, :c=>3, :d=>4}
- むずかしいね…
Discussion