サンプルコード
odd_numbers = (0..Float::INFINITY).lazy.map{ |n| n.succ }.select{ |n| n.odd? }.take(3) p odd_numbers.force
lazyがない場合、mapで要素の数だけ無限に繰り返され、処理が終わらないという所まで分かりました。
lazyがある場合、遅延評価により3つ値が取り出せます。
しかしここでの遅延評価とはどういう手順を踏んでいるのでしょうか?
評価を遅延しても結局は無限の数からmaps処理を行うことは変わらないはずです。
それともlazyがある場合、ここの
odd_numbers = (0..Float::INFINITY).lazy.map{ |n| n.succ }.select{ |n| n.odd? }.take(3)
一行だけ最後までとりあえず読み込む。
そして後ろから読み込み、take(3)で3つ値が入った配列を取得する。
という所から順に読み込んでいかないとEnumeratorインスタンスが無限に発生することになるような気がします。
lazyが読み込まれたあとはどうった順番で処理が行われているのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/13 03:09
2017/10/13 03:59
2017/10/13 04:30
2017/10/13 04:37
2017/10/13 04:42