概要
コードレビューをしていて、自分の知らない記法(yield_self
)にあって、便利だと思ったので紹介します。
yield_selfとは
レシーバをブロックパラメータとして取ることができ、返り値としてブロック内の実行の結果を返します。似たような挙動をするものに、tap
というメソッドがあります。
tap
はレシーバをブロックパラメータとして取るという点では同じですが、返り値としてはレシーバの値をそのまま返すという点で異なっています。
返り値として、ブロックの実行結果を返すことから、以下のようなコードをシンプルに書くことができます。
例: user_idのリストを複数のメソッドで絞り込んで行きたいケース
hoge_user_ids = fetch_hoge_user_ids(user_ids)
fuga_user_ids = fetch_fuga_user_ids(hoge_user_ids)
yield_self
を使うことで、以下のようなシンプルなメソッドチェーンで書き直すことができます。
some_user_ids
.yield_self{|user_ids| fetch_hoge_user_ids(user_ids) }
.yield_self{|user_ids| fetch_fuga_user_ids(user_ids) }
このようにただ引数として渡すために変数に代入する手間を省くことができます。
参考
tap
とyield_self
の違いについてシンプルに紹介されています。