这个问题不是关于如何在 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
then 很容易理解,但这里并非如此。这是一个普通的旧的yield
,那么它是如何工作的?
我查看了 enumerator.c 但对我来说几乎无法理解。也许有人可以在 Ruby 中提供一个实现,使用纤维,而不是 1.8.6 风格的基于延续的枚举器,这一切都清楚了吗?