为啥 Enumerable 中的方法返回 Enumerator?

Posted

技术标签:

【中文标题】为啥 Enumerable 中的方法返回 Enumerator?【英文标题】:Why do methods from Enumerable return an Enumerator?为什么 Enumerable 中的方法返回 Enumerator? 【发布时间】:2014-12-21 13:40:45 【问题描述】:

如果你不通过一个块,来自 Ruby 的 Enumerable 的许多方法将返回一个 Enumerator

例子:

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

这是什么原因?他们为什么不直接返回 nil 或其他表示没有阻止的信息。

【问题讨论】:

不清楚你所说的“方法不能each本身”是什么意思。 谢谢。我已经清理了描述。 【参考方案1】:

枚举器让您控制迭代

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

Enumerable#lazy 是最有用(但未被充分利用)的方法之一。您可以在需要时一次获取一个,而不是一次从一个范围内具体化一百​​万个整数。例如:

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

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

【讨论】:

好答案。另一个好处是可以将枚举数作为参数传递给方法,以便使用nextpeek 等进行操作,而无需知道枚举数是什么(例如arr.selectarr.reject)。枚举器有时也有助于简化笨拙的代码。例如,如果你想让一个值在truefalse 之间交替,你可以简单地写v = [true,false].cycle,然后写v.next => true; v.next => false; v.next => true...

以上是关于为啥 Enumerable 中的方法返回 Enumerator?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 enumerable: false 不会级联到 TypeScript 中的继承类?

为啥 Enumerable#detect 需要 Proc/lambda?

为啥 Enumerable 不实现 IEnumerable?

为啥 Enumerable.Range 比直接 yield 循环快?

为啥不推荐使用 Enumerable#each_with_object ?

为啥 Ruby on Rails 的 Enumerable 显示计数为 3 但“.each”仅打印出项目 1 次