>>610
Rubyはよく知らないけど、Smalltalkの場合にはstreamによる外部イタレータもあるね。
| stream |
stream ← 'omaemona' readStream.
[ stream atEnd not] whileTrue: [Transcript nextPut: stream next]

元が配列でなくても、例えばファイルなら
| stream |
stream ← 'file.name' asFilename readStream.
[ stream atEnd not] whileTrue: [Transcript nextPut: stream next].
stream close
とか。
内部イタレータだけでできる事は限られてくるから、
外部イタレータも必要に応じてちゃんと用意しといたほうがいい。