instance method Enumerable#lazy

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