From: Akinori MUSHA Date: 2009-03-17T17:49:31+09:00 Subject: [ruby-dev:38176] Re: [Bug #1198] corrupted iteratoin during "enum_for :inject" --pgp-sign-Multipart_Tue_Mar_17_17:52:11_2009-1 Content-Type: text/plain; charset=ISO-2022-JP At Fri, 13 Mar 2009 19:47:54 +0900, matz wrote: > 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の挙動は明らかにバグなので修正する必要がある > と思います。それをどの方向に直すかですが、ここは非互換でもすっ > きりした修正の方が望ましいのではないでしょうか。  Enumerator#each_with_index については明らかなバグと言える挙動 だったのですが、 Enumerable#each_with_index は1.8と同じ仕様で 動いていたことがわかりました。 % ruby-1.9.1 -e 'Enumerator.new{|y| y.yield(); y.yield(1); y.yield(1,2) }.to_a.each_with_index {|*x| p x}' [nil, 0] [1, 1] [[1, 2], 2] この両者で挙動が食い違うわけにもいかないので、少なくとも1.9系列は 1.8仕様で行くしかなさそうです。  ただし、 with_index のみ変えるというのはありかもしれません。 いや、そんな違いはわかりにくいからなしかな…。 -- Akinori MUSHA / http://akinori.org/ --pgp-sign-Multipart_Tue_Mar_17_17:52:11_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkm/ZLsACgkQkgvvx5/Z4e67LQCg1OGig29chJiZLAhTWyvWnixo VhYAoL0YjljBFjLyLxP/vdEuFCAku1Zs =VCoX -----END PGP SIGNATURE----- --pgp-sign-Multipart_Tue_Mar_17_17:52:11_2009-1--