ruby – 如何使用枚举器

Ruby Array Class文档中,我经常发现:

If no block is given,an enumerator is returned instead.

为什么我不将块传递给#map?我的做法有什么用:

[1,2,3,4].map

而不是做:

[1,4].map{ |e| e * 10 } # => [10,20,30,40]

有人能告诉我一个使用这个枚举器的非常实用的例子吗?

解决方法

在核心库(Array,Hash)和标准库(Set,SortedSet)中,Enumerator和大多数其他数据结构之间的主要区别在于Enumerator可以是无限的.你不能拥有所有偶数的数组或零流或所有素数,但你绝对可以有这样一个枚举器:
evens = Enumerator.new do |y|
  i = -2
  y << i += 2 while true
end

evens.take(10)
# => [0,4,6,8,10,12,14,16,18]

zeroes = [0].cycle

zeroes.take(10)
# => [0,0]

那么,你可以用这样的枚举器做什么?好吧,三件事,基本上.

> Enumerator混合使用Enumerable.因此,您可以使用所有Enumerable方法,例如map,inject,all?,any?,none ?,select,reject等等.请注意,枚举器可能是无限的,而map会返回一个数组,因此尝试映射无限的枚举器可能会创建一个无限大的数组并占用无限的时间.
>有一些包装方法以某种方式“丰富”枚举器并返回一个新的枚举器.例如,Enumerator #with_index为块添加“循环计数器”,Enumerator #with_object添加备忘录对象.
>您可以使用枚举器,就像您在其他语言中使用它进行外部迭代一样,使用Enumerator#next方法,它将为您提供下一个值(并向前移动Enumerator)或在Enumerator为有限时引发stopiteration异常你已经到了尽头.

†例如,无限范围:(1..1.0 / 0)

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...