読者です 読者をやめる 読者になる 読者になる

✲゚。.ヾ(⌒(ノ'ω')ノ☆.。

変色系男子の日常。

ボクの編み出した 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 } }