Iterator その1

まずはIterator。サンプルプログラムを単純に移植してみます。

module Iterator
  class Book
    def initialize(name)
      @name = name
    end
    attr_reader :name
  end
  class BookShelf
    def initialize
      @books = []
      @length = 0
    end
    def [](i)
      @books[i]
    end
    def append(book)
      @books << book
      @length += 1
    end
    def get_enumerator
      BookShelfEnumerator.new(self)
    end
    attr_reader :length
  end
  class BookShelfEnumerator
    def initialize(book_shelf)
      @book_shelf = book_shelf
      @index = -1
    end
    def current
      @book_shelf[@index]
    end
    def next
      if @index < @book_shelf.length - 1
        @index += 1
        true
      else
        false
      end
    end
    def reset
      @index = -1
    end
  end
end

include Iterator
book_shelf = BookShelf.new
book_shelf.append(Book.new("Hello, Ruby vol.1"))
book_shelf.append(Book.new("Hello, Ruby vol.2"))
book_shelf.append(Book.new("Hello, Ruby vol.3"))
e = book_shelf.get_enumerator
while e.next
  puts e.current.name
end

これは外部イテレータですね。Rubyでは内部イテレータが好まれているので、
次は内部イテレータでの実装を考えたいと思います。