In message "[ruby-list:6291] Re: i++"
    on 98/02/05, Yuji Shigehiro <sigehiro / asama.rd.ecip.osaka-u.ac.jp> writes:

|しげひろです.

|ですが, 「イテレータが何回繰り返したか」という情報は, 本来イテレータが
|備えている性質で, イテレータとともに実装される * べき * なのでしょうか?

いやあ,私は違うと思いますね.

|オブジェクト指向的に考えると, ここで用意されるべきは
|
|  カウンタークラス ??
|
|のようなものだと思います.

あ伊藤さんが紹介してましたね.

|> 外部イテレータでしたら,カーソルオブジェクトに聞けば良いんでしょ
|> うけど.
|ところで, これ↑は無いんでしょうか. (実は, 欲しかったりする.)

さすがに汎用のは作れなかったんですが,個別のクラス用のは簡単
です.以下は配列用の外部イテレータの例です.

  class AryIter
    def initialize(ary)
      @ary = ary
      @pos = 0
    end
    def first
      @pos = 0
    end
    def succ
      if @pos >= @ary.size
        raise RangeError, "iterate over the array length"
      end
      val = @ary[@pos]
      @pos += 1
      val
    end
    def more
      if @pos < @ary.size
        return true
      end
      false
    end
  end

  ary = [1,2,3,4,5,6,7,8,9]
  iter = AryIter.new(ary)
  while iter.more
    p iter.succ
  end

# こういう時nextが予約語なのが痛い….

Threadと組み合わせたりすると汎用の外部イテレータが定義できる
かも知れません.
                                まつもと ゆきひろ /:|)