ruby – 如何使用枚举器

前端之家收集整理的这篇文章主要介绍了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)

猜你在找的Ruby相关文章