在
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。