tofucodes diary

にほんごのほう

RubyのEnumeratorが理解できたような気がした話

仕事で先人のRubyのコードを見てたらEnumeratorというクラスが出てきました。

初見だったのでググってドキュメントを見てみたがよく分かりませんでした。

特に「遅延評価」てところがパッときませんでした。

(1..Float::INFINITY).map{ |n| n * 2 }.first(5)

=> 無限リストをループするためfirstまで実行されず処理が終わらない
(1..Float::INFINITY).first(5)

=> [1,2,3,4,5]

これが遅延評価(どん!)。

どうでしょうか?分かりましたか?

僕は上記ではよく分かりませんでしたが、Enumerator::Lazyを使って手元でコード書いてみてやっと理解できました。

まずはEnumerator::Lazyを使わない例。

[1,2,3,4,5].map do |item|
    p item
    item * 10
end.each do |num|
    p num
end

=> 1,2,3,4,5,10,20,30,40,50

次にEnumerator::Lazyを使った例。

[1,2,3,4,5].lazy.map do |item|
    p item
    item * 10
end.each do |num|
    p num
end

=> 1,10,2,20,3,30,4,40,5,50

こちらの記事を見て理解することができました。

Rubyist Magazine - 無限リストを map 可能にする Enumerable#lazy

あとから知ったんだけど、上記の記事の筆者はEnumerator#lazyの作者だそうな。