[ruby-list:50856] Re: [質問]自己代入を繋げた場合の動作について
From:
wanzerbusi@...
Date:
2019-12-26 03:36:45 UTC
List:
ruby-list #50856
皆様
横から失礼いたします。
この問題簡単にクローズしないほうが良いかと思います。##もっと議論すべきでは。
コードを一読したとき、私の感覚ですが、9になるべきと考えました。逆に48になるほうがおかしいと思いました。
根拠として私は
a = a + (a = a + (a = a + (a = a + 5)))
の式は
a = 4a + 5
と(厳密ではないかもしれませんが)等価と判断しております。であれば、9になって48になりえないです。
また、初心者丸出しの誤解かもしれませんが、Rubyにおける変数は全てオブジェクトと解釈しております。ならば、なおさらa = 4a + 5
の"="を解釈した際に初めて変数のオブジェクトが書き換えられるのではとも解釈しております。
むろん間違った解釈であれば訂正いただきたいです。
C(等)については値を箱(おそらくスカラー)で持つプログラム言語と解釈しているので、a = a + (a = a + (a = a + (a = a + 5)))については、a' = a + 5a'' = a' + a'a''' = a'' + a''a'''' = a''' + a'''a = a''''とおそらくコンパイラが機械語に変換するときに上記の式(と等価として)へ変換しているのでしょう。
となると値をベクトル要素で持つR言語ではどうなのか。そもそも機械語に変換したときに(アドレスは)どうあるべきなのか。とかいろいろなパターンをつっこんで考えるべきではないのでしょうか。
>自己代入の+=の場合は右辺を先に評価するような仕様の方が便利だったかもしれない
と一足飛びに考えるのは私は早計と思料しております。##逆にこの一文が無ければ私は黙ってました><
以上
佐藤 信二 拝
----- Original Message -----
From: 関優輔 <t181d035@gmail.com>
To: Ruby users (Japanese) <ruby-list@ruby-lang.org>
Date: 2019/12/26, Thu 08:28
Subject: [ruby-list:50855] Re: [質問]自己代入を繋げた場合の動作について
関です。
前田さん、お返事ありがとうございます。
.+()の左辺が先に評価されて計算されるという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は+=が文なの文法エラーでした。
>
> 過去に議論があったか思い出せませんが、自己代入の+=の場合は右辺を先に評
> 価するような仕様の方が便利だったかもしれないですね。