lazy -> Enumerator::Lazy
[permalink][rdoc][edit]-
自身を lazy な Enumerator に変換したものを返します。
この Enumerator は、以下のメソッドが遅延評価を行う (つまり、配列ではなくEnumeratorを返す) ように再定義されています。
- map/collect
- flat_map/collect_concat
- select/find_all
- reject
- grep
- take, take_while
- drop, drop_while
- zip (※一貫性のため、ブロックを渡さないケースのみlazy)
- cycle (※一貫性のため、ブロックを渡さないケースのみlazy)
以下はピタゴラス数 (a**2 + b**2 = c**2 を満たす自然数 a, b, c の組) を列挙するプログラムです。
def pythagorean_triples (1..Float::INFINITY).lazy.flat_map {|z| (1..z).flat_map {|x| (x..z).select {|y| x**2 + y**2 == z**2 }.map {|y| [x, y, z] } } } end # 最初の10個のピタゴラス数を表示する p pythagorean_triples.take(10).force # takeはlazyなので、forceが必要です p pythagorean_triples.first(10) # firstはeagerです # 100より小さいピタゴラス数を表示する p pythagorean_triples.take_while { |*, z| z < 100 }.force
[SEE_ALSO] Enumerator::Lazy