yieldを使ったメソッドを書けるようにする
Amazonに電話する時間がなかったのでASK開発はおやすみ。
Scalaの勉強をしていてyield
という単語が出てきた。
こいつ、業務で書いているRubyでもよく見かけるけど、なんなのかよくわかっていない。
そこで今日は、Scalaは一旦置いといて、「Rubyでいうyield
ってなに」を解消することにする。
ググって出てきた記事を読んでみる。
読んだ内容をまとめると、
- Rubyではすべてのメソッドにおいて、ブロックを引数として渡すことができる。
- ブロックには手続きを書くことができる。例えば
{p "hoge"}
て感じで。 - メソッドの引数にブロックを渡した場合は、ブロックは
Proc
クラスのオブジェクトとしてメソッドに渡される。 - 渡された
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"
おお、ちゃんと動いた。
使い方はわかった気がするけど、用途がよくわからないので、
もう少し調べる必要があると思う。