これはRoRではなく、Rubyそのもののお話。
っていうか、yieldって何て読むの?イェールド?
それは置いといて、Rubyのコード見てると時々目にするyield。
とりあえず参考書にはこう書いてある。
****************************
yield文を使うと、メソッドに関連付けられているブロックを
メソッドから1回または複数回呼び出すことができます。
****************************
なんのこっちゃって感じなのでまずは「ブロック」から。
ブロックとは、中括弧{}またはdo...endを使ってコードをまとめたもの。
①単一行
{ puts "Hello" }
②複数行
do
club.enroll(person)
person.socialize
end
①も②も中括弧やdo...endで囲まれてるので「ブロック」と呼ばれる。
これをメソッドに渡すにはメソッド名の後にブロックを記述すればよい。
greet { puts "Hello" }
と言った具合。この場合のメソッドはgreet()となる(括弧は省略)。
ちなみに括弧を省略しない(メソッドにパラメータがある)場合はこんな感じ。
verbose_greet("Dave", "お得意様") { puts "こんにちは" }
と、ここまででブロックの説明は終わりにして、本題のyieldについて。
yieldは「記述されているメソッドに関連付けられているブロックを実行する」もの。
def method1
yield
end
method1 do
puts 'Hello'
end
実行結果:Hello
まず、下のmethod1が実行されるわけだけど、
これはdefで定義された上のmethod1を呼び出すことになる。
すると、method1はyieldを呼び出すことになる。
yieldは、yieldが記述されているメソッド(つまりmethod1)に
関連付けられているdo...endで囲まれたブロック実行するので、
puts 'Hello'を実行する。
***
yieldを複数回呼び出すとループさせることができたり、
yieldに引数を渡したりもできるらしい。
でもこれはまたちょい複雑なのでまた今度ってことで。
