引用具有指定索引的枚举器值

时间:2012-06-11 01:56:44

标签: ruby enumerable

假设我有一个可枚举的对象enum,现在我想得到第三个项目。

我知道其中一种通用方法是转换为数组,然后使用索引进行访问:

enum.to_a[2]

但是这种方式会创建一个临时数组,效率可能会很低。

现在我用:

enum.each_with_index {|v, i| break v if i == 2}

但这是非常丑陋和多余的。

最有效的方法是什么?

3 个答案:

答案 0 :(得分:5)

您可以使用take剥离前三个元素,然后使用lasttake给出的数组中抓取第三个元素:

third = enum.take(3).last

如果您根本不想生成任何数组,那么可能:

# If enum isn't an Enumerator then 'enum = enum.to_enum' or 'enum = enum.each'
# to make it one.
(3 - 1).times { enum.next }
third = enum.next

答案 1 :(得分:5)

使用enumerable-lazy或Ruby 2.1替代mu的答案。像使用next一样懒惰但更具说明性:

enum.lazy.drop(2).first

答案 2 :(得分:1)

不幸的是,要通过索引访问成员,必须将其转换为数组(否则你首先没有索引),所以你的代码看起来非常好。