ボクの編み出した tap 技
当たり前な使い方だったり、あまり使えなかったりするかもしれませんがご紹介。
tap とは…
Object クラスに定義されたシンプルなのにエレガントなメソッドである! ブロックに自分自身 (レシーバ) を渡して実行し、自分を返すだけのメソッド。
class Object def tap yield(self) self end end
これが色々使えるんだよ!
1. tapp もどき
メソッドチェーンに挟んで p したりします!
MahoShojo.where(name: %w{佐倉杏子 美樹さやか}).tap(&method(:p)).where(…).order(…)
2. tap で if
tap
は通常は self (レシーバ自身をそのまま) を返すんだけど、
ブロック内で break
を使うことで任意のものを返すことができる。
MahoShojo.where(name: %w{鹿目まどか 美樹さやか 巴マミ}).tap do |scope| if params[:majo] == "Charlotte" break scope.where(shibou_flag: true) end end.where(…).order(…)
特定の場合だけメソッドチェーンにメソッドを挟みたいとき等に使える。(読みにくくなるけど)
3. tap と binding.pry
RSpec でデバッグ (pry) したいとき、例えば subject の中身を覗いたりできる。
subject { JSON.parse(response.body).tap {|homu| binding.pry } }