こころがホッコリー

ただイカしたRubyistになりたい人生だった。

yieldをミニマムな例で理解しようとしてみた

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としっかり向き合いたい方には下記の記事をオススメします。

d.hatena.ne.jp

で、yield使って何が嬉しいの?

「実践的な事例がないとわからないよ!」
「結局、yieldを使って嬉しいことって何があるの?」

という方は、リファクタリングRubyという本の中に登場する、
「6.12 サンドイッチメソッドの抽出」という実例にあたってみて欲しいです。
設計の負債(クローンコード)を、yieldを使って華麗に解決しており、大変勉強になります。

www.amazon.co.jp

本を買うのはちょっと……という方は、下記の記事でも「サンドイッチメソッドの抽出」について触れられているので、どうぞ。

d.hatena.ne.jp