コードを読んでいるとたまに出てくるtapというメソッド。自分の中で使い方がはっきりしていなかったので、今回は例を交えて紹介していきたいと思います。
※下記の文中で頻出するレシーバーって何と思う方は、下記のリンクの説明が分かりやすいかと思います。
レシーバーとは??
その1(メソッドチェーン内のデバックに使用)
処理の中でメソッドチェーンを使用して書くことは良くあると思いますが、実行結果が想定した値とズレている場合、どこで異常をきたしているのか特定が難しいケースがあると思います。そうしたケースの場合、tapを使用することで各メソッドごとの実行結果を表示させることができるので、異常箇所の特定がしやすいです。
['え', 'う', 'あ', 'い', 'お']
.sort
.tap{|receiver| p receiver}
.reverse
.tap{|receiver| p receiver}
実行結果
["あ", "い", "う", "え", "お"]
["お", "え", "う", "い", "あ"]
tapメソッドのブロックには、tapメソッドを呼び出したレシーバー自身が引数に渡されるため、ここでは.sortで昇順で並び替えられた配列がブロックの引数に渡されます。なので実行結果に["あ", "い", "う", "え", "お"]と表示されるわけですね。
その2(レシーバーを返却しないメソッドにレシーバーを返却させたい)
例えばデータを作成するロジックがあったとして、Railsではsaveメソッドをよく使用するかと思いますが、saveメソッドの実行結果は真偽値を返却します。しかし保存した結果の主キーを元に次のロジックを書きたいといった際に、下記のように書くのは冗長になりがちです。こうしたケースの場合でもtapは有効に使えます。
tap未使用
customer_model = CustomerModel.new(params)
customer_model.save # saveの返り値はtrue/false
customer_model.id
tap使用
CustomerModel.new(params).tap(&:save).id
tapを使用することで、保存処理後のレシーバが返されます。なのでその後直接.idとして取り出すことができるわけですね。
終わりに
以上、簡単にtapの使い方を参考例と共に紹介させて頂きました。意外と便利なメソッドなので、今後は有効活用していけたらなと思います。