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では内部イテレータが好まれているので、
次は内部イテレータでの実装を考えたいと思います。