外部イテレータ 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