ぜったいってなに

Software Engineerのブログです。

yieldを使ったメソッドを書けるようにする

Amazonに電話する時間がなかったのでASK開発はおやすみ。


Scalaの勉強をしていてyieldという単語が出てきた。

こいつ、業務で書いているRubyでもよく見かけるけど、なんなのかよくわかっていない。

そこで今日は、Scalaは一旦置いといて、「Rubyでいうyieldってなに」を解消することにする。

ググって出てきた記事を読んでみる。

d.hatena.ne.jp

読んだ内容をまとめると、

  1. Rubyではすべてのメソッドにおいて、ブロックを引数として渡すことができる。
  2. ブロックには手続きを書くことができる。例えば{p "hoge"}て感じで。
  3. メソッドの引数にブロックを渡した場合は、ブロックは
    Procクラスのオブジェクトとしてメソッドに渡される。
  4. 渡されたProcオブジェクトはyieldで呼び出せる。

つまりyieldは、

yieldが宣言されているメソッドに渡されたProcオブジェクト(手続き)を呼び出すメソッド」

で、あってるはず。

適当に検証してみる。

$ irb
irb(main):001:0> def hoge
irb(main):002:1>   yield
irb(main):003:1> end
=> :hoge
irb(main):004:0> hoge{p "fuga"}
"fuga"
=> "fuga"

確かに、特にブロック引数を定義していないけど呼び出せました。

次はProcオブジェクトとして手続きを定義してメソッドに渡してみる。
ブロック引数であることを明示するには、引数の頭に&をつければいいらしい。

irb(main):005:0> block = Proc.new{p "hoge"}
irb(main):006:0> hoge &block
"hoge"
=> "hoge"

おお、ちゃんと動いた。

使い方はわかった気がするけど、用途がよくわからないので、
もう少し調べる必要があると思う。