多くの要素を持つ Ruby 配列を考えてみましょう。
配列を逆に反復処理し、特定のブロックが true を返す最初の n 個の結果を選択したいと考えています。
例えば
seniors = persons.reverse.select do |person|
person.age > 60
end
これは問題ありませんが、最大で n 人のシニアではなく、すべてのシニアを収集します。n 個の結果が収集されたときに反復を途中で終了する最も良い方法は何ですか?
多くの要素を持つ Ruby 配列を考えてみましょう。
配列を逆に反復処理し、特定のブロックが true を返す最初の n 個の結果を選択したいと考えています。
例えば
seniors = persons.reverse.select do |person|
person.age > 60
end
これは問題ありませんが、最大で n 人のシニアではなく、すべてのシニアを収集します。n 個の結果が収集されたときに反復を途中で終了する最も良い方法は何ですか?
seniors = []
persons.reverse.each{ |p|
seniors << p if p.age > 60
break if seniors.count >= n
}
遅延評価は、厳密な評価で通常使用する抽象化を変更せずにこの種のコードを記述できるため、優れています (Haskell はこれがいかに強力であるかを証明しています)。幸いなことに、Ruby 2.0 にはこの点に関するいくつかのインフラストラクチャが付属しています。その時が来れば、次のように記述できるようになります。
# Ruby >= 2.0
seniors = persons.reverse.lazy.select { |person| person.age > 60 }.take(n)
Ruby < 2.0 の場合: https://github.com/yhara/enumerable-lazy