【发布时间】:2012-06-13 23:42:41
【问题描述】:
假设我有一个可枚举对象enum,现在我想获得第三个项目。
我知道一种通用方法是转换为数组,然后使用如下索引进行访问:
enum.to_a[2]
但是这种方式会创建一个临时数组,可能效率不高。
现在我使用:
enum.each_with_index {|v, i| break v if i == 2}
但这是相当丑陋和多余的。
最有效的方法是什么?
【问题讨论】:
标签: ruby enumerable
假设我有一个可枚举对象enum,现在我想获得第三个项目。
我知道一种通用方法是转换为数组,然后使用如下索引进行访问:
enum.to_a[2]
但是这种方式会创建一个临时数组,可能效率不高。
现在我使用:
enum.each_with_index {|v, i| break v if i == 2}
但这是相当丑陋和多余的。
最有效的方法是什么?
【问题讨论】:
标签: ruby enumerable
【讨论】:
enum,但您对此无能为力(通常)。
next 几次几乎是免费的。从技术上讲,枚举器甚至不必是有限的,因此无法保证 to_a 甚至可以工作。
xs.to_enum
使用 enumerable-lazy 或 Ruby 2.1 替代 mu 的答案。像使用 next 一样懒惰,但更具声明性:
enum.lazy.drop(2).first
【讨论】:
不幸的是,要通过索引访问成员,必须将其转换为数组(否则您一开始就没有索引),所以您的代码对我来说看起来非常好。
【讨论】:
e 是Enumerator,那么2.times { e.next } 将勾选并丢弃前两个值,第三个e.next 将为您提供第三个值而不生成任何数组。