Bug #1198
closedcorrupted iteratoin during "enum_for :inject"
Description
=begin
以下のように、1.8と1.9でenum_for(:inject)したときの振る舞いが違うようです。
zsh % ruby -ve '[:x].enum_for(:inject, :y).with_index {|*a| p a }'
ruby 1.8.7p5000 (2009-02-24 revision 22586) [x86_64-linux]
[[:y, :x], 0]
zsh % ruby -ve '[:x].enum_for(:inject, :y).with_index {|*a| p a }'
ruby 1.9.2dev (2009-02-24 trunk 22589) [x86_64-linux]
[:y, 0]
=end
Files
Updated by knu (Akinori MUSHA) over 16 years ago
- File with_index-compat.patch with_index-compat.patch added
=begin
振る舞いが違うのは (each_)with_index の方です。
1.9では、イテレータ関数の第一引数には最初の引数だけが渡るようになり、
多値を取りたければ第三第四引数でargc/argvを見る必要があります。
この変更に対応する変更が施されていないため、そのような挙動になっています。
単に1.8と同じように振る舞わせるためには添付のパッチでいいはずです。
=end
Updated by matz (Yukihiro Matsumoto) over 16 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:38076] [Bug #1198] corrupted iteratoin during "enum_for :inject""
on Tue, 24 Feb 2009 19:29:44 +0900, Akinori MUSHA [email protected] writes:
|振る舞いが違うのは (each_)with_index の方です。
|1.9では、イテレータ関数の第一引数には最初の引数だけが渡るようになり、
|多値を取りたければ第三第四引数でargc/argvを見る必要があります。
|この変更に対応する変更が施されていないため、そのような挙動になっています。
|
|単に1.8と同じように振る舞わせるためには添付のパッチでいいはずです。
コミットしてください。
=end
Updated by knu (Akinori MUSHA) over 16 years ago
=begin
ただ、この場合分けは1.9で整理した単値・多値の扱いの一貫性を崩すことにもなるので
もう少し考えた方がいいと思います。
with_index-compat.patch の通り、1.8では、
- yield() されたら yield(nil, idx) する
- yield(single) されたら yield(single, idx) する
- yield(*multiple) されたら yield(multiple, idx) する
といういびつな仕様で、単値か多値かを知っていないと正しいコードが書けない場合があります。
1.9では { |*args, idx| ... } という受け取り方ができるので、単に
- yield(*any) されたら yield(*any, idx) する
というすっきりした仕様に変更するという選択肢も十分に考えられます。
互換性が最大の障害ですけどね…。
=end
Updated by knu (Akinori MUSHA) over 16 years ago
- File deleted (
with_index-incompat.patch)
=begin
=end
Updated by matz (Yukihiro Matsumoto) over 16 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:38078] [Bug #1198] corrupted iteratoin during "enum_for :inject""
on Tue, 24 Feb 2009 19:53:59 +0900, Akinori MUSHA [email protected] writes:
|ファイル with_index-incompat.patch 追加
|
|ただ、この場合分けは1.9で整理した単値・多値の扱いの一貫性を崩すことにもなるので
|もう少し考えた方がいいと思います。
うーむ。
|1.9では { |*args, idx| ... } と受け取り方ができるので、単に
|
|- yield(*any) されたら yield(*any, idx) する
|
|というすっきりした仕様に変更するという選択肢も十分に考えられます。
なるほど。
|互換性が最大の障害ですけどね…。
まず現在の1.9.1の挙動は明らかにバグなので修正する必要がある
と思います。それをどの方向に直すかですが、ここは非互換でもすっ
きりした修正の方が望ましいのではないでしょうか。
武者さんがコミットされますか?
まつもと ゆきひろ /:|)
=end
Updated by knu (Akinori MUSHA) about 16 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r22992.
=end