Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

injectやmapのブロックの中が複雑になってきたら、素直にメソッドチェイン式に改めた方がいいかも

たとえば、次のようなコードがあったとします。

result = data.inject([]) {|a,c| ((c.x) > 10) ? a << c.y : a }

ブロックの中がグチャグチャしてますね。
こういう時は、素直に

result2 = data.select {|e| e.x > 10}.map(&:y)

その上、この形式ならlazyを適用する事もできます。
数が膨大な時は有利ですね。

result3 = data.lazy.select {|e| e.x > 10}.map(&:y)    
#>> #<Enumerator::Lazy: #<Enumerator::Lazy: #<Enumerator::Lazy: [#<struct Point x=20, y=22>, #<struct Point x=2, y=8>, #<struct Point x=22, y=30>, #<struct Point x=-8, y=9>]>:select>:map>

これなら、数が多くなった場合有利?