ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

Rubyのtapメソッドが便利なので紹介する

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) }

変数名とかを考える手間が減って便利な小技でした。