Project

General

Profile

Actions

Bug #1198

closed

corrupted iteratoin during "enum_for :inject"

Added by shyouhei (Shyouhei Urabe) over 16 years ago. Updated about 14 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 1.9.2dev (2009-02-24 trunk 22589) [x86_64-linux]
Backport:
[ruby-dev:38075]

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

with_index-compat.patch (653 Bytes) with_index-compat.patch knu (Akinori MUSHA), 02/24/2009 07:30 PM
with_index-incompat.patch (630 Bytes) with_index-incompat.patch knu (Akinori MUSHA), 02/24/2009 07:54 PM
Actions #1

Updated by knu (Akinori MUSHA) over 16 years ago

=begin
振る舞いが違うのは (each_)with_index の方です。
1.9では、イテレータ関数の第一引数には最初の引数だけが渡るようになり、
多値を取りたければ第三第四引数でargc/argvを見る必要があります。
この変更に対応する変更が施されていないため、そのような挙動になっています。

単に1.8と同じように振る舞わせるためには添付のパッチでいいはずです。
=end

Actions #2

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 writes:

|振る舞いが違うのは (each_)with_index の方です。
|1.9では、イテレータ関数の第一引数には最初の引数だけが渡るようになり、
|多値を取りたければ第三第四引数でargc/argvを見る必要があります。
|この変更に対応する変更が施されていないため、そのような挙動になっています。
|
|単に1.8と同じように振る舞わせるためには添付のパッチでいいはずです。

コミットしてください。

=end

Actions #3

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

Actions #4

Updated by knu (Akinori MUSHA) over 16 years ago

  • File deleted (with_index-incompat.patch)

=begin

=end

Actions #5

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 writes:

|ファイル with_index-incompat.patch 追加
|
|ただ、この場合分けは1.9で整理した単値・多値の扱いの一貫性を崩すことにもなるので
|もう少し考えた方がいいと思います。

うーむ。

|1.9では { |*args, idx| ... } と受け取り方ができるので、単に
|
|- yield(*any) されたら yield(*any, idx) する
|
|というすっきりした仕様に変更するという選択肢も十分に考えられます。

なるほど。

|互換性が最大の障害ですけどね…。

まず現在の1.9.1の挙動は明らかにバグなので修正する必要がある
と思います。それをどの方向に直すかですが、ここは非互換でもすっ
きりした修正の方が望ましいのではないでしょうか。

武者さんがコミットされますか?

                             まつもと ゆきひろ /:|)

=end

Actions #6

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

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0