2013-09-20 19 views
0

我正忙着用Ruby來學習語言。目前,我正試圖圍繞纖維的概念進行研究。根據this answer,它們通常用於創建(無限)外部統計員。另一方面,這似乎與所謂的明確統計員的概念重疊。我想寫一個代碼片段來觸發連續的素數(是的,下面的算法的運行時間爲O(可怕))。我可以通過使用光纖實現它:纖維與明確的普查員

prime_fiber = Fiber.new do 
    primes = [2] 
    Fiber.yield 2 
    current = 1 
    loop do 
     current += 2 
     unless primes.find {|value| (current % value) == 0} 
      Fiber.yield current 
      primes << current 
     end 
    end 
end 

ARGV[0].to_i.times {print "#{prime_fiber.resume}, "} 

這本身不發出枚舉器對象,雖然它不是很難創造一個出來。相比之下,我還可以利用一個明確定義枚舉,這已經是一個枚舉對象的好處:

prime_enum = Enumerator.new do |yielder| 
    primes = [2] 
    yielder.yield 2 
    current = 1 
    loop do 
     current += 2 
     unless primes.find {|value| (current % value) == 0} 
      yielder.yield current 
      primes << current 
     end 
    end 
end 

ARGV[0].to_i.times {print "#{prime_enum.next}, "} 
# I could also write: 
# p prime_enum.first(ARGV[0].to_i) 

這兩種方法都讓我實現某種協同例程,他們似乎是互換我。那麼我什麼時候更喜歡一個呢?是否有一些共同商定的做法?我發現很難把所有這些成語都放在我的腦海裏,所以如果這被認爲是一個愚蠢的問題,我就提前道歉。

回答

0

我會使用Enumerator,它允許您使用taketake_while,甚至each如果您的序列是有限的。而Fiber專爲輕量級併發而設計,並且相當有限,因爲它是枚舉器。

prime_enum.take(ARGV[0].to_i).each { |x| puts x } 

prime_enum.take_while { |x| x < ARGV[0].to_i }.each { |x| puts x } 
+0

所以,我想建議普查員都需要,只要值僅僅作爲_sequences_和我應該用纖維,如果我想強調我的代碼的併發性方面。 – Tunix