Ruby 枚举数相对于集合的优势

Ruby 枚举数相对于集合的优势,ruby,Ruby,我看不到枚举数的用途。戴夫·托马斯的书指出: 枚举器允许您将枚举的概念捕获为对象。这允许您将枚举存储在变量中,并将其作为参数传递,等等 但我也可以将数组分配给变量,将数组作为参数传递,等等。事实上,我认为使用常规迭代器和类似集合的数组比使用枚举器更简洁: str = "quick brown fox" str.scan(/\w+/).each {|w| puts w } quick brown fox vs 枚举版本需要额外的步骤,并产生相同的结果。什么时候对带有迭代器的集合使用枚举更实用?使

我看不到枚举数的用途。戴夫·托马斯的书指出:

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

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

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


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

使用枚举器会使数组不允许的某些事情成为可能

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

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

e = Enumerator.new { |y| s = 'a'; loop { y << s = s.succ } }
e.first(5)  # => ["b", "c", "d", "e", "f"]
e=Enumerator.new{y|s='a';loop{y[“b”,“c”,“d”,“e”,“f”]
此示例显示了一个无限序列,这意味着必须对其进行延迟计算,因为您的计算机是有限的。但是,即使您不使用无限序列,延迟计算仍然可以非常有助于节省CPU时间

此外,枚举数还可以用作外部迭代器,这为如何使用它提供了各种各样的灵活性。(请参见7stud的答案以获取示例。)

枚举数也是外部迭代器,它允许您一次迭代两个数组:

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()会自动捕获该异常并终止。

您能提供一个示例吗?@JohnMerino,
e=[1,2,3]。循环p e.first(10)
您在这里所做的事情可以通过一个数组和一个增加的索引整数来完成,但是一个枚举器可以让我们更简洁地编写它。哇!这就是我发现使用
循环
而不是
while
的第一个原因!
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