tappと書いてタププ

rubykaigiの永和さんのセッション中にチラッと紹介されてたtapp。

require 'pp'

class Object
  def tapp
    tap { pp block_given? ? yield(self) : self }
  end

  def taputs
    tap { puts block_given? ? yield(self) : self }
  end
end

セッションでは、よくわかんなかったんだけど
ソースを見ると、納得。なるほどなぁ。
ちょっとしたデバッグに便利そう。

>> (1..5).select(&:odd?).map(&:succ).join
=> "246"

#tappを使うと
>> (1..5).tapp.select(&:odd?).tapp.map(&:succ).tapp.join
1..5
[1, 3, 5]
[2, 4, 6]
=> "246"

#taputsもあるよ
>> (1..5).tapp.select(&:odd?).tapp.map(&:succ).taputs.join
1..5
[1, 3, 5]
2
4
6