外部イテレータ in ruby

標準添付されているGeneratorライブラリを使えばいいみたい。

#!/usr/bin/ruby

require 'generator'

teststr = 'abcde'.split('')
# teststr.each {|c| puts c }

g = Generator.new(teststr)

puts g.current # => a
puts g.next # => a
puts g.next # => b
puts g.next # => c
puts g.rewind.next # => a
puts g.next # => b
puts g.next # => c
puts g.next # => d
puts g.next # => e
puts g.next # => EOFError

うーん。巻き戻しすると最初に戻っちゃうのか。確かにブロックを与えたときcall/ccで実装するのを考慮すると、prevの実装は大変そう。

そういえばruby1.9ではもっと簡単に扱えるようになるみたいですよ:
http://mono.kmc.gr.jp/~yhara/d/?date=20071215#p03