Bug #4443
odd evaluation order in a multiple assignment
Description
遠藤です。core に投げてしまったようなので登録し直し。
Ruby は左から右に評価が進むと信じていたのですが、多重代入で裏切られました。
def foo
p :foo
[]
end
def bar
p :bar
end
x, foo[0] = bar, 0
bar より foo が左にあるので、:foo 、:bar の順に出力されることを期待するのですが、なんと :bar 、:foo になります。
具体的に何が困るかというと、例えば
obj, obj.foo = obj.foo, obj
には swap を期待するわけですが、そうなりません。こういうコードは実際に、木の回転などを実装するときにしばしば書きたくなります。この挙動に気がついたのも splay tree を実装していたときでした。こんなの:
t.left, t.left.right, t = t.left.right, t, t.left
1.9 系列で修正すべきとまでは思いませんが、2.0 で直る可能性はあるでしょうか。
IRC で話したら「それで普通」みたいな反応もありましたが、
foo[0] = bar
はちゃんと :foo 、:bar の順に出ます。
--
Yusuke Endoh mame@tsg.ne.jp
Related issues
Updated by mame (Yusuke Endoh) over 9 years ago
http://redmine.ruby-lang.org/issues/4440
に matz の返事があります。
優先順位は高くありませんが、直すべきだと思います。
とはいうものの、1.8のころからこうだったのですし、直すのが難しいのも確
かなのですが。
確か redmine の更新直後で、インターフェイスの違いにハマってチケット登録に失敗してしまったのでした。
--
Yusuke Endoh mame@tsg.ne.jp
Updated by matz (Yukihiro Matsumoto) over 9 years ago
- ruby -v changed from ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux] to -
まつもと ゆきひろです
In message "Re: [ruby-dev:43724] [Ruby 1.9 - Bug #4443] odd evaluation order in a multiple assignment"
on Sat, 11 Jun 2011 15:49:30 +0900, Koichi Sasada redmine@ruby-lang.org writes:
まつもとさん,こちらいかがでしょうか.
直せと言われたら私なのかなぁ.
すでに遠藤さんが指摘してくださいましたが、直せるものなら直し
たいと思ってます。
Updated by matz (Yukihiro Matsumoto) over 9 years ago
まつもと ゆきひろです
In message "Re: [ruby-dev:43724] [Ruby 1.9 - Bug #4443] odd evaluation order in a multiple assignment"
on Sat, 11 Jun 2011 15:49:30 +0900, Koichi Sasada redmine@ruby-lang.org writes:
|まつもとさん,こちらいかがでしょうか.
|直せと言われたら私なのかなぁ.
すでに遠藤さんが指摘してくださいましたが、直せるものなら直し
たいと思ってます。
Updated by naruse (Yui NARUSE) over 9 years ago
- Project changed from Ruby master to CommonRuby
- Target version deleted (
3.0)
Updated by matz (Yukihiro Matsumoto) almost 9 years ago
Cから受け継いだ代入の評価順が「おかしい」のが原因である(本来は a → b と表記すべきか)ことを考えると、
むしろ foo[0] = bar が :bar, :fooと動作するようにすべきでしょうか。
いや、単なる思いつきなのですが。
ちなみに今調べたら mruby は foo[0] = bar が :bar, :fooと動作しますね。
Matz.
Updated by mame (Yusuke Endoh) almost 9 years ago
まあ、それはそれでいいかなと思います。
ちなみに ISO とかの標準的にはどうなってるんでしょう?
--
Yusuke Endoh mame@tsg.ne.jp
Updated by matz (Yukihiro Matsumoto) over 8 years ago
手元にあるJIS x3017のドラフトを見ると現状の評価順(多重代入の場合には右辺が先)が記述してありますね(11.4.2.4)。
どうしたもんだか。
Updated by ko1 (Koichi Sasada) over 8 years ago
- Assignee changed from matz (Yukihiro Matsumoto) to ko1 (Koichi Sasada)
Updated by ko1 (Koichi Sasada) over 8 years ago
- Status changed from Assigned to Closed
duplicated (http://bugs.ruby-lang.org/issues/4443)
Updated by nahi (Hiroshi Nakamura) about 8 years ago
- Status changed from Closed to Open
It looks to be closed by mistake.
Updated by ko1 (Koichi Sasada) about 8 years ago
- Category set to core
- Target version set to 2.6
...これバグなんだっけ? feature のような気もしますが.
2.0 には無理っぽいので,next minor にしておきます.
Updated by akr (Akira Tanaka) almost 3 years ago
関連すると思われるささださんの昔のメールを見つけました: ruby-dev:31579
1) 右辺が重複しないローカル変数の列だったら今まで通り (副作用はないので問題ない) 2) そうじゃなければ,色々コストをかけて順番通りに実行 ということにしたいと思います.多分,(1) がほとんどではないかと期待. ネストした多重代入は (1) にはあてはまりませんが,まぁしょうがない.