inject と reduce
昨日の日刊で書いたプログラミング問題のコレクション使用1ライナー版。
def each_rand_seven (0..Float::INFINITY).lazy.map{ rand(0..9) }.inject([]){ |list, x| x == 7 ? (break [list, x].flatten) : [list, x].flatten } end
ポイントはlazy による無限長リストの遅延評価と、break によるinject の終了指定。
ハマったのが「三項演算子でbreak を呼ぶ場合には、パーレン(括弧)で括ってやる必要がある」と知らなかったこと。
あと、inject(注ぐ)のエイリアスがreduce(削る)ってのは面白かったですね。
まあ、処理部の内容に応じて好きな方で呼べって事と理解しました。
それにしても、コレクション便利だなあ。
もっとちゃんと扱える様になろう。
なお、昨日書いた再帰版はこちら。