[ruby-list:50853] [質問] 自己代入を繋げた場合の動作について
From:
関優輔 <t181d035@...>
Date:
2019-12-24 15:06:37 UTC
List:
ruby-list #50853
関と申します。
Rubyの自己代入についての質問があります。
aをIntegerの変数として、1を代入した状態で
a += a += a += a += 5
を実行してからaを出力すると期待する出力は48ですが実際には9が出力されます。
48の根拠は(5+1)*2*2*2=48ということと、Cを含む他の言語で48になるということです。
自己代入を繋げて書かずに分けて書くと期待する値になります。
これはRubyの仕様 なのでしょうか。それともバグなのでしょうか。
### ソースここから
puts "version #{RUBY_VERSION}"
a, b, c = [1, 2, 3]
a += a += a += a += 5
b += c += b += c += 5
puts "a, b, c = #{[a, b, c]}" #=> [9, 15, 13]
a, b, c = [1, 2, 3]
a += 5; a += a; a += a; a += a
c += 5; b += c; c += b; b += c
puts "a, b, c = #{[a, b, c]}" #=> [48, 28, 18]
### ソースここまで
### 期待した実行結果
version 2.6.5
a, b, c = [48, 28, 18]
a, b, c = [48, 28, 18]
### 実際の実行結果
version 2.6.5
a, b, c = [9, 15, 13]
a, b, c = [48, 28, 18]
これは下のようにXOR swapを書こうとして気がついたことです。
### ソースここから
puts "version #{RUBY_VERSION}"
a, b = [220, 284]
a ^= b ^= a ^= b
puts "a, b = #{[a, b]}"
### ソースここまで
### 期待した実行結果
version 2.6.5
a, b = [284, 220]
### 実際の実行結果
version 2.6.5
a, b = [0, 220]
+=、^=だけではなく他の自己代入でも起こります。
よろしくお願いたします。