RubyのObject#tap
が便利だったので紹介します。(昔からあるらしいけど)
tapメソッドとは
ブロック文を渡すと中身の処理を走らせてレシーバを返すメソッドです。
hoge = "test".tap do |string| puts string true end puts hoge # "test"
Objectクラスに定義されているので大体のクラスで使えます。
メリット
レシーバを返さない破壊的メソッドにレシーバを返させることができます。
いちいち変数を作って入れて…って処理を省いたりできます。
Railsのsaveとか
例えば「DBに保存してActiveRecordのインスタンス変数からidを取り出して返すメソッド」なんてものを作る時には
def save_something_record some_model = SomeModel.new(params) some_model.save # saveの返り値はtrue/false some_model.id end
とsave
メソッドがtrue/falseを返すために変数に一度入れないといけないところが
def save_something_record SomeModel.new(params).tap(&:save).id end
と1行で書けます。saveメソッドはtrue/falseを返しますが、tapメソッドにより保存処理後のレシーバが返されます。
RSpecなんかでちょっとしたテストデータを用意する時もちょっとした小技として使えます。
HogeServiceを作って実行した後のインスタンスが欲しいなんて時には以下でOKです。
let(:executed_hoge_service) { HogeService.new.tap(&:execute) }
変数名とかを考える手間が減って便利な小技でした。