最近、「Programming Ruby 1.9&2.0」という本を読み始めました。明示的な列挙子のトリックを示しています
triangular_numbers = Enumerator.new do |yielder|
number = 0
count = 1
loop do
number += count
count += 1
yielder.yield number
end
end
5.times { print triangular_numbers.next, " " }
puts
なぜ、この yielder.yield が一時的にループを抜け、次の列挙子オブジェクトが作成されるまでnumberの値を返すのか疑問に思います。ループブロック内でyieldが発生した場合は、通常のケースとは異なるようです。APIdock を確認すると、Proc.yield() のソース コードが Proc.call() と同じであることがわかりました。Enumerator クラスの Yielder オブジェクトの場合、Yielder は yield() をオーバーライドしています。しかし、yielder.yield が一時的にループブロックを離れるのはなぜでしょうか?