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?