3

ブロックを通過する最初の「n」エントリを取得したい

a = 1..100_000_000 # Basically a long array

# This iterates over the whole array -- no good
b = a.select{|x| x.expensive_operation?}.take(n)

'高価な'条件が真であるn個のエントリを取得したら、反復を短絡させたい。

何を指示してるんですか?take_whileとnのカウントを維持しますか?

# This is the code i have; which i think can be written better, but how?
a = 1..100_000_000 # Basically a long array
n = 20
i = 0
b = a.take_while do |x|
  ((i < n) && (x.expensive_operation?)).tap do |r|
    i += 1
  end
end
4

2 に答える 2

5

Ruby 2.0は遅延列挙型を実装します。古いバージョンの場合は、gemenumerable-lazyを使用します。

require 'enumerable/lazy'
(1..Float::INFINITY).lazy.select(&:even?).take(5).to_a
#=> [2, 4, 6, 8, 10]
于 2012-10-28T11:46:54.227 に答える
1

for単純なループとbreak:で動作するはずです。

a = 1..100_000_000 # Basically a long array
n = 20
selected = []
for x in a
  selected << x if x.expensive_operation?
  break if select.length == n
end
于 2012-10-28T13:55:11.920 に答える