为什么Enumerable中的方法返回枚举器?

时间:2014-10-26 03:42:19

标签: ruby iterator enumeration enumerable

如果你没有通过阻止,Ruby的Enumerable中的许多方法都会返回Enumerator

示例:

array = [1,2,3]
array.each.class
# => Enumerator
array.each { |n| n+10 }.class
# => Array

这是什么原因?为什么他们不会返回nil或其他信号表明没有给出阻止的东西。

1 个答案:

答案 0 :(得分:4)

枚举器让您控制迭代

除其他外,枚举器可让您在迭代对象时控制。有时您不需要迭代发生 now ,因此您存储Enumerator以供以后使用,而不是立即将结果传递给块。其他时候,您可能希望对迭代过程本身进行更精细的控制。

最有用(和未充分利用)的方法之一是Enumerable#lazy。您可以在需要时一次抓取一个整数,而不是同时从一个范围内统一一百万个整数。例如:

enum = (1..1_000_000).lazy
enum.next #=> 1
enum.next #=> 2
enum.peek #=> 3
enum.next #=> 3

这具有明显的性能影响。您的里程可能会有所不同。