2011-10-13 92 views
1

我想了解Enumerator類是如何工作的。具體來說,我不知道如何創建yielder對象並將其傳遞給構造函數所需的代碼塊。如何實現基本的枚舉類?

這是我第一次嘗試:

class MyEnumerator 
    def initialize(&block) 
    @block = block 
    end 
    def next() 
    @block.call self 
    end 
    def yield(*args) 
    args 
    end 
end 


num_gen = MyEnumerator.new do |yielder| 
    (1..10).each { |num| yielder.yield num } 
end 

5.times { p num_gen.next } 

它是不工作的,當然,因爲我不知道如何推動枚舉。有人能幫我理解我可以如何實現它嗎?

回答

1

下面是建立一個基本的枚舉的一種方式(與tokland的建議更新):

class MyEnumerator 
    def initialize 
    @fiber = Fiber.new { yield Fiber } 
    end 

    def next 
    @fiber.resume 
    end 
end 

用法:

>> num_gen = MyEnumerator.new { |f| (1..10).each { |x| f.yield x } } 
=> #<MyEnumerator:0x007fd6ab8f4b28 @fiber=#<Fiber:0x007fd6ab8f4ab0>> 
>> num_gen.next 
=> 1 
>> num_gen.next 
=> 2 
>> num_gen.next 
=> 3 
>> num_gen.next 
=> 4 
+0

整潔。也許「@fiber = Fiber.new {yield Fiber}」模擬Enumerator行爲? – tokland

+0

我之前有點匆忙,但這使得它更好,謝謝! –