7

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

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

enum.to_a[2]

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

现在我使用:

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

但这是相当丑陋和多余的。

最有效的方法是什么?

4

3 回答 3

6

您可以使用take剥离前三个元素,然后last从数组中获取第三个元素,从而take为您提供:

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
于 2012-06-11T02:06:18.873 回答
5

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

enum.lazy.drop(2).first
于 2012-06-11T06:30:41.003 回答
1

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

于 2012-06-11T02:13:13.720 回答