Rubyを始めて間もない頃、 「yieldが全然わからん……」 という壁にぶち当たることがありました。
当時、親切な同僚から懇切丁寧な説明をいただいたんですが、
いかんせん自分の基礎能力が低すぎて理解が追いつかず、申し訳なさすぎる……。
同僚曰く、
「自分で実装して理解するのが一番早いですよ」
ということで、当時、お題をいただき、見よう見真似で実装してみたものを晒します。
お題
def foo # 処理A # 処理B # 処理C end def bar # 処理A # 処理D # 処理C end
自分の実装
class YieldSample def foo common { puts "Label B" } end def bar common { puts "Label D" } end private def common puts "Label A" yield puts "Label C" end end obj = YieldSample.new obj.foo obj.bar
出力結果
Label A Label B Label C Label A Label D Label C
考察
上記例は、yield
の動きがわかるよう、わざとらしい実装にしています。
コードと出力結果から読み取れるよう、yield
は、
「呼び出し元から渡されたブロックを実行する」
という振る舞いをします。
何を期待するかは、呼び出し元にすべて委ねるんですね。
もっとちゃんと解説している方がいるので、yield
としっかり向き合いたい方には下記の記事をオススメします。
で、yield使って何が嬉しいの?
「実践的な事例がないとわからないよ!」
「結局、yieldを使って嬉しいことって何があるの?」
という方は、リファクタリングRubyという本の中に登場する、
「6.12 サンドイッチメソッドの抽出」という実例にあたってみて欲しいです。
設計の負債(クローンコード)を、yieldを使って華麗に解決しており、大変勉強になります。
本を買うのはちょっと……という方は、下記の記事でも「サンドイッチメソッドの抽出」について触れられているので、どうぞ。