这个问题不是关于如何在1.9.1使用普查员,而是我很好奇他们是如何工作的。下面是一些代码:枚举器如何在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,但它对我来说是相当不容易理解的。也许有人可以在Ruby中提供一个实现,使用光纤,而不是1.8.6风格的继续式的枚举器,这使得它很清楚?
谢谢您的回答。是的,我在这方面要求了很多细节。具体而言,我想知道是否有可能在Ruby中实现它,或者在C中是否有某些秘密行为,这在Ruby中是不可能的。如果可以纯粹用Ruby来实现它,我很乐意看到代码! :) – horseyguy 2009-09-17 01:45:17