如何在Ruby中获取Enumerable的第n个元素

Ste*_*fan 6 ruby

例如,要返回我可以写的第10,000个素数:

require 'prime'
Prime.first(10000).last #=> 104729
Run Code Online (Sandbox Code Playgroud)

但是创建一个巨大的中间数组,只是为了检索它的最后一个元素感觉有点麻烦.

鉴于Ruby是如此优雅的语言,我会期待如下:

Prime.at(9999) #=> 104729
Run Code Online (Sandbox Code Playgroud)

但没有Enumerable#at.

以上解决方法是否有意或是否有更直接的方法来获取第n个元素Enumerable

Fre*_*ung 8

我能想到的最接近假设的at方法是drop跳过指定数量的元素.它尝试返回一个实际的数组,所以如果你使用无限序列,你需要将它与lazy组合,例如

Prime.lazy.drop(9999).first
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 5

那这个呢?

Prime.to_enum.with_index(1){|e, i| break e if i == 10000}
# => 104729
Run Code Online (Sandbox Code Playgroud)

对于非懒惰的枚举器,您可能想要放置lazy枚举器.

  • 可能是因为如果你只对一个特定的值感兴趣,那么应该有一个直接返回这个值的方法,而不是一个枚举器。对于素数,我认为当您想要第 n 个素数时会有更多用例,而不是从头开始。所以 `Prime` 类没有按照它应该的方式设计,或者受其内部算法的影响太大。 (2认同)