为啥 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
这对性能有明显的影响。您的里程可能会有所不同。
【讨论】:
好答案。另一个好处是可以将枚举数作为参数传递给方法,以便使用next
、peek
等进行操作,而无需知道枚举数是什么(例如arr.select
或arr.reject
)。枚举器有时也有助于简化笨拙的代码。例如,如果你想让一个值在true
和false
之间交替,你可以简单地写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 循环快?