加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何使用枚举器

发布时间:2020-12-17 04:20:11 所属栏目:百科 来源:网络整理
导读:在 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] 有人能告诉我一个使用这个枚举器的
在 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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读