To pytanie nie dotyczy tego, jak używać enumeratorów w Rubim 1.9.1, ale raczej jestem ciekawy jak one działają. Oto kod:Jak działają enumeratory w Rubim 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
W powyższym kodzie mogę używać e = Bunk.new.each
, a następnie e.next
, e.next
dostać każdego kolejnego elementu, ale jak dokładnie jest to zawieszając wykonanie, a następnie wznowienie na właściwym miejscu?
Jestem świadomy, że jeśli wydajność w 0.upto
zostanie zastąpiona wartością Fiber.yield
, łatwo jest to zrozumieć, ale tak nie jest w tym przypadku. To jest zwykły stary yield
, więc jak to działa?
Spojrzałem na enumerator.c, ale jest to niezrozumiałe dla mnie. Być może ktoś mógłby zapewnić implementację w Ruby, używając światłowodów, a nie opartych na 1.8.6 stylowych modułów wyliczających, które to wszystko wyjaśnia?
dzięki za odpowiedź. tak, proszę o dość dużo szczegółów na ten temat. konkretnie chciałbym wiedzieć, czy możliwe jest zaimplementowanie tego wszystkiego w Ruby lub czy jest coś podstępnego w C, co nie jest możliwe w Ruby. Jeśli możliwe jest zaimplementowanie go wyłącznie w Ruby, chciałbym zobaczyć kod! :) – horseyguy