RubyのObject#tap
が便利だったので紹介します。(昔からあるらしいけど)
tapメソッドとは
ブロック文を渡すと中身の処理を走らせてレシーバを返すメソッドです。
hoge = "test".tap do |string|
puts string
true
end
puts hoge
Objectクラスに定義されているので大体のクラスで使えます。
メリット
レシーバを返さない破壊的メソッドにレシーバを返させることができます。
いちいち変数を作って入れて…って処理を省いたりできます。
Railsのsaveとか
例えば「DBに保存してActiveRecordのインスタンス変数からidを取り出して返すメソッド」なんてものを作る時には
def save_something_record
some_model = SomeModel.new(params)
some_model.save
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) }
変数名とかを考える手間が減って便利な小技でした。