この質問は、Ruby 1.9.1で列挙子を使用する方法についてではなく、それらがどのように機能するのか興味があります。ここにいくつかのコードがあります:
class Bunk
def initialize
@h = [*1..100]
end
def each
if !block_given?
enum_for(:each)
else
0.upto(@h.length) { |i|
yield @h[i]
}
end
end
end
上記のコードでは、、、e = Bunk.new.each
次にe.next
、e.next
を使用して連続する各要素を取得できますが、実行を一時停止してから適切な場所で再開するのはどの程度正確ですか?
の歩留まりをに0.upto
置き換えるとFiber.yield
わかりやすいと思いますが、ここではそうではありません。それは昔ながらのことですが、yield
どのように機能しますか?
enumerator.cを見ましたが、私には理解できないほどです。たぶん誰かが、1.8.6スタイルの継続ベースの列挙子ではなく、ファイバーを使用してRubyで実装を提供することができます。これにより、すべてが明確になりますか?