枚举器优于集合的优点

时间:2014-10-10 03:58:22

标签: ruby

我没有看到使用普查员。戴夫托马斯'书中说明了这一点:

  

Enumerator允许您将枚举的概念捕获为对象。这允许您将枚举存储在变量中,将它们作为参数传递,等等。

但我也可以将数组分配给变量,将数组作为参数传递等等。事实上,我认为使用带有类似数组的常规迭代器比使用枚举器更简洁:

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

VS

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

枚举版本需要额外的步骤并产生相同的结果。什么时候在使用迭代器的集合上使用枚举更实用?

2 个答案:

答案 0 :(得分:3)

使用枚举器可以实现阵列不允许的一些事情。

Enumerator可以表示延迟计算的序列,这意味着生成元素的代码在需要元素之前不会运行。

这意味着枚举器可以表示无限序列。例如:

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

这个例子显示了一个无限序列,这意味着它必须被懒惰地评估,因为你的计算机是有限的。但即使你不使用无限序列,懒惰的评估仍然可以非常有助于节省CPU时间。

此外,Enumerator可以用作外部迭代器,它为您使用它提供了各种灵活性。 (参见7stud的答案中的一个例子。)

答案 1 :(得分: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()会自动捕获该异常并终止。