Rubyの世界ではだいたいなんでもオブジェクトだったのでした。
Rubyのメソッドは()
で括った引数だけでなく、
do .... end
または{ .... }
で括ったコードブロックを続けることができます。
コードブロックは引数同様メソッドに引き渡されます。
したがって、メソッドはブロックに対して、それを実行したり、それを変数に保存しておいたりと様々な処理を施せます。
こういうのを「ブロック付きメソッド呼び出し」とか「ブロック構文」とか呼びます。
では、メソッドとコードブロックはどのようにはたらくのでしょうか。
メソッド内にyield
を書くことがポイントです。
大雑把には、yield = (コードブロックの中身に書いてあること)
としてはたらきます。
# yieldを手続きとしてみなす
def foo
print "yo!"
yield
print "yoyoyo!"
end
foo{ print "yoyo!" }
# yieldを値(返り値)としてみなす
def foo
return yield
end
print foo{ "Hello." }
# yield var1, var2, ... と書くと、逆流(?)する。すなわち、メソッド内からブロックの||で囲われた部分へブロックパラメータが渡る。
def foo
yield 1, 2, 3
end
foo{|x, y, z|
print x
print y
print z
}
ブロック構文がわかると
['toast', 'cheese', 'wine'].each { |food| print food.capitalize }
たのしい引用元
みたいな、Ruby独特の書き方が身近に感じられるような気がしますね・・・?