Jak działają enumeratory w Ruby 1.9.1?

To pytanie nie dotyczy tego, jak używać Enumeratorów w Ruby 1.9.1, ale raczej jestem ciekawy jak one działają. Oto kod:

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

W powyższym kodzie mogę użyće = Bunk.new.each, i wtedye.next, e.next aby uzyskać każdy kolejny element, ale jak dokładnie zawiesza wykonanie, a następnie wznawia pracę we właściwym miejscu?

Zdaję sobie sprawę, że jeśli wydajność w0.upto jest zastąpiony przezFiber.yield to jest łatwe do zrozumienia, ale tutaj tak nie jest. To jest zwykłe stareyield, więc jak to działa?

Spojrzałem na enumerator.c, ale jest to dla mnie niezrozumiałe. Może ktoś mógłby dostarczyć implementację w Rubim, wykorzystując włókna, a nie enumeratory kontynuujące w stylu 1.8.6, które czynią to wszystko jasnym?

questionAnswers(4)

yourAnswerToTheQuestion