2014-10-10 62 views
2

我沒有看到使用統計員。戴夫托馬斯的書陳述如下:統計員超過集合的優勢

枚舉器允許您捕獲作爲一個對象的枚舉的概念。這允許您將枚舉存儲在變量中,將它們作爲參數傳遞,等等。

但我也可以分配數組到變量,傳遞數組作爲參數等。事實上,我認爲使用常規的迭代器集合像數組比使用枚舉更簡潔:

str = "quick brown fox" 
str.scan(/\w+/).each {|w| puts w } 
quick 
brown 
fox 

str = "quick brown fox" 
enum = str.to_enum(:scan, /\w+/) 
enum.each { |w| puts w } 
quick 
brown 
fox 

枚舉版本需要一個額外的步驟,併產生相同的結果。何時使用迭代器對集合使用枚舉更實用?

回答

3

使用枚舉使一些事情可能陣列不允許。

枚舉器可以代表被懶惰地評估的序列,這意味着代碼來生成的元件直到需要該元件沒有得到運行。

這意味着,一個枚舉可代表無限序列。例如:

e = Enumerator.new { |y| s = 'a'; loop { y << s = s.succ } } 
e.first(5) # => ["b", "c", "d", "e", "f"] 

這個例子顯示了一個無限序列,這意味着它必須懶洋洋地評估,因爲您的計算機是有限的。但即使你沒有使用無限序列,懶惰的評估對於節省CPU時間仍然非常有幫助。

而且,枚舉器可以使用外部迭代器,它提供了你如何使用它的各種靈活性。 (見7stud的回答是一個例子。)

+0

你能提供一個例子嗎? – JohnMerlino 2014-10-10 04:02:04

+0

@JohnMerino,'E = [1,2,3] .cycle p e.first(10)' – 7stud 2014-10-10 04:06:08

2

普查員也外部迭代器,它允許你在一次遍歷兩個數組:

e1 = [1, 2, 3].each 
e2 = ['a', 'b', 'c'].each 

loop do 
    num, ch = e1.next, e2.next 
    puts "#{num} -> #{ch}" 
end 

--output:-- 
1 -> a 
2 -> b 
3 -> c 

當枚舉用完的項目,它提出了一個StopIteration異常,並且loop()自動捕獲該異常並終止。

+0

你正在做這裏的事情可能與陣列和增加的索引整數來實現的,但一個枚舉允許我們寫得更簡潔。 – 2014-10-10 04:12:26

+0

哇!所以這是我發現使用'loop'而不是'while'的第一個原因! – 2014-10-10 04:13:25