🌊

[Bug #20858] 複数の変数、値の代入式での挙動に関するチケット

2024/11/12に公開

[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}
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 = "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}
  • むずかしいね…
GitHubで編集を提案

Discussion