如果你没有通过阻止,Ruby的Enumerable
中的许多方法都会返回Enumerator
。
示例:
array = [1,2,3]
array.each.class
# => Enumerator
array.each { |n| n+10 }.class
# => Array
这是什么原因?为什么他们不会返回nil
或其他信号表明没有给出阻止的东西。
答案 0 :(得分:4)
除其他外,枚举器可让您在迭代对象时控制。有时您不需要迭代发生 now ,因此您存储Enumerator以供以后使用,而不是立即将结果传递给块。其他时候,您可能希望对迭代过程本身进行更精细的控制。
最有用(和未充分利用)的方法之一是Enumerable#lazy。您可以在需要时一次抓取一个整数,而不是同时从一个范围内统一一百万个整数。例如:
enum = (1..1_000_000).lazy
enum.next #=> 1
enum.next #=> 2
enum.peek #=> 3
enum.next #=> 3
这具有明显的性能影响。您的里程可能会有所不同。