[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]

+=、^=だけではなく他の自己代入でも起こります。

よろしくお願いたします。

In This Thread

Prev Next