Rubyのtapはメソッドチェーンだけのものじゃない!

あるインスタンス変数にオブジェクトがセットされているときに
その参照を外しつつ
そのオブジェクトを返すというメソッドが必要になったんだよ
次のような感じだよ

 @name = nil #at initialize

 def set_name(name)
   @name = name
 end

 def reset_name

 end

 set_name('Charlie') # => "Charlie"
 reset_name # => "Charlie"


ここでreset_nameしたときに
インスタンス変数にセットされてた
オブジェクトを返したいんだ
なんかよくありそうだよね


こんなときは普通reset_nameを
次のように書くと思うんだ

 def reset_name
   name = @name
   @name = nil
   name
 end

 set_name('Charlie') # => "Charlie"
 reset_name # => "Charlie"


でもなんかスマートじゃないよね


で少し考えたんだけど
多重代入を使うともう少しマシになるんだ

 def reset_name
   name, @name = @name, nil
   name
 end

 set_name('Charlie') # => "Charlie"
 reset_name # => "Charlie"


でもやっぱり返り値を確保するためだけに
ローカル変数を用意しなきゃならないなんて
なんかイケてないよね..


そこでObject#tapの出番ですよ奥さん..

 def reset_name
   @name.tap { @name = nil }
 end

 set_name('Charlie') # => "Charlie"
 reset_name # => "Charlie"
 @name # => nil


tapはそのブロックを評価するけれども
その結果を捨ててしまうという
謙虚な変わり者のメソッドだよ


なかなかイケてると思うんだけど
どうかな?
周知のTipsだったらごめんね