まつもと ゆきひろです

In message "Re: [ruby-list:45360] Q:Array#eachの挙動に関して"
    on Wed, 20 Aug 2008 16:03:59 +0900, 小西 弘将 <konishih / fd6.so-net.ne.jp> writes:

|Array#eachの挙動についてちょっと嵌ったので、質問します。
|手元にあるRubyでeachの挙動をみると次のwhile文と等価に見えます。まあ、そ
|のままリソースを食いつぶすまで動き続けます。
|これはこれでよいのですが、この動作はすべてのバージョンで保証されるので
|しょうか?
|私の感覚としては、現在の実装がそうなっているだけで、挙動は保証しないとい
|う見解が正しいように思えます。
|なぜ嵌ったかというと、eachのイメージとして、each開始前の集合を順に渡すと
|いうイメージがあったためです。間抜けといわれればそうですが嵌りました。
|こっちも割とありそうなイメージなので、こちらの方が驚きが少ないと思われる
|場合、each中の自己挿入は禁止すべきだと思うのですが、実装は難しい感じがし
|ます。

以前にそのような「each中の自己挿入は禁止」という挙動を実装し
てみましたが、かなりのコードでエラーが発生して動かなくなりま
した。ということは繰り返しの最中に自己を書き換えるようなコー
ドはそれなりにあるということです。

現時点ではRubyには明文化された公式の仕様があるわけではないの
で「保証」という単語を使うのは躊躇しますが、少なくとも

  * each中の自己挿入を禁止するわけにはいかない
  * 現在の挙動はそれなりに考えた結果である
  * それに依存しているプログラムもそれなりにある
  * 他のRuby実装でも同じように動いている
  * 今後もそうである可能性はかなり高い

ということは言えると思います。

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