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の作者だそうな。