[ruby-list:50855] Re: [質問]自己代入を繋げた場合の動作について
From:
関優輔 <t181d035@...>
Date:
2019-12-25 23:28:46 UTC
List:
ruby-list #50855
関です。 前田さん、お返事ありがとうございます。 .+()の左辺が先に評価されて計算されるというRubyの仕様による結果であるということが理解できました。 ありがとうございました。 失礼します。 2019年12月25日(水) 10:52 Shugo Maeda <shugo@ruby-lang.org>: > > 前田です。 > > On Wed, 25 Dec 2019 00:06:37 +0900 > "関優輔" <t181d035@gmail.com> wrote: > > aをIntegerの変数として、1を代入した状態で > > a += a += a += a += 5 > > を実行してからaを出力すると期待する出力は48ですが実際には9が出力されます。 > > 48の根拠は(5+1)*2*2*2=48ということと、Cを含む他の言語で48になるということです。 > > 自己代入を繋げて書かずに分けて書くと期待する値になります。 > > > > これはRubyの仕様 なのでしょうか。それともバグなのでしょうか。 > > Rubyではx += yはx = x + yの構文糖なので > > a += a += a += a += 5 > > は > > a = a + (a = a + (a = a + (a = a + 5))) > > と同じ意味になります。 > > また、x + yの評価順序は > > 1. xの評価 > 2. yの評価 > 3. 「xの評価結果.+(2の評価結果)」というメソッド呼び出し > > ですので、+の左辺のaはすべて右辺よりも先に評価されて、初期値の1になります。 > ということで、5に1が4回加算されて9になるのは現状では仕様だと思います。 > JavaScriptでも結果は9になるようです。 > # Pythonはどうかなと思ったらPythonは+=が文なの文法エラーでした。 > > 過去に議論があったか思い出せませんが、自己代入の+=の場合は右辺を先に評 > 価するような仕様の方が便利だったかもしれないですね。