Bug #4443

odd evaluation order in a multiple assignment

Added by Yusuke Endoh about 3 years ago. Updated over 1 year ago.

[ruby-dev:43272]
Status:Open
Priority:Normal
Assignee:Koichi Sasada
Category:core
Target version:next minor
ruby -v:- Backport:

Description

=begin
遠藤です。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
=end


Related issues

Duplicates ruby-trunk - Bug #4440: odd evaluation order in a multiple assignment Closed 02/24/2011

History

#1 Updated by Shyouhei Urabe about 3 years ago

  • Status changed from Open to Assigned

#2 Updated by Koichi Sasada almost 3 years ago

まつもとさん,こちらいかがでしょうか.
直せと言われたら私なのかなぁ.

#3 Updated by Yusuke Endoh almost 3 years ago

http://redmine.ruby-lang.org/issues/4440
に matz の返事があります。

優先順位は高くありませんが、直すべきだと思います。

とはいうものの、1.8のころからこうだったのですし、直すのが難しいのも確
かなのですが。

確か redmine の更新直後で、インターフェイスの違いにハマってチケット登録に失敗してしまったのでした。

Yusuke Endoh mame@tsg.ne.jp

#4 Updated by Yukihiro Matsumoto almost 3 years ago

  • ruby -v changed from ruby 1.9.2p0 (2010-08-18 revision 29036) [i686-linux] to -

まつもと ゆきひろです

In message "Re: [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:

|まつもとさん,こちらいかがでしょうか.
|直せと言われたら私なのかなぁ.

すでに遠藤さんが指摘してくださいましたが、直せるものなら直し
たいと思ってます。

#5 Updated by Yukihiro Matsumoto almost 3 years ago

まつもと ゆきひろです

In message "Re: [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:

|まつもとさん,こちらいかがでしょうか.
|直せと言われたら私なのかなぁ.

すでに遠藤さんが指摘してくださいましたが、直せるものなら直し
たいと思ってます。

#6 Updated by Yui NARUSE over 2 years ago

  • Project changed from ruby-trunk to CommonRuby
  • Target version deleted (Next Major)

#7 Updated by Yui NARUSE over 2 years ago

  • Project changed from CommonRuby to ruby-trunk

#8 Updated by Yukihiro Matsumoto about 2 years ago

Cから受け継いだ代入の評価順が「おかしい」のが原因である(本来は a → b と表記すべきか)ことを考えると、
むしろ foo[0] = bar が :bar, :fooと動作するようにすべきでしょうか。

いや、単なる思いつきなのですが。

ちなみに今調べたら mruby は foo[0] = bar が :bar, :fooと動作しますね。

Matz.

#9 Updated by Yusuke Endoh about 2 years ago

まあ、それはそれでいいかなと思います。
ちなみに ISO とかの標準的にはどうなってるんでしょう?

Yusuke Endoh mame@tsg.ne.jp

#10 Updated by Yukihiro Matsumoto almost 2 years ago

手元にあるJIS x3017のドラフトを見ると現状の評価順(多重代入の場合には右辺が先)が記述してありますね(11.4.2.4)。
どうしたもんだか。

#11 Updated by Koichi Sasada almost 2 years ago

  • Assignee changed from Yukihiro Matsumoto to Koichi Sasada

#12 Updated by Koichi Sasada almost 2 years ago

  • Status changed from Assigned to Closed

#13 Updated by Hiroshi Nakamura over 1 year ago

  • Status changed from Closed to Open

It looks to be closed by mistake.

#14 Updated by Koichi Sasada over 1 year ago

  • Category set to core
  • Target version set to next minor

...これバグなんだっけ? feature のような気もしますが.
2.0 には無理っぽいので,next minor にしておきます.

Also available in: Atom PDF