procとは?
procとは、ブロックをオブジェクト化したものを指します。
ブロックとは
そもそもブロックとは、do~endや{~})で囲まれたカタマリです。
1行の場合はdoブロックではなく{~}を使用します(以下の例では分かりやすいように一行で書けるコードもdoブロックで書いています。)
例1
numbers.each do |number|
number*2
end
例2
numbers.each {|number| number*2}
ブロックの呼び出し方
で、このブロックはいくつかの呼び出し方があります。
callメソッドの場合
まずは一番基本形の形です。
ブロックを受け取るメソッドであることを引数"&block"で明示しています。
ちなに、この&というのはブロックをprocオブジェクトに変換しています。
#ブロックを受け取るメソッド
def certain_block(&block)
block.call
end
#メソッドの引数としてブロックを渡し、実行する
certain_block do
p "Hello, block!"
end
=> "Hello, block!"
ブロック引数を渡し、yieldする場合
次に、ブロックをcallメソッドで呼び出す代わりに、"yield"を使用する場合です。
引数は"&block"のままです。
#ブロックを受け取るメソッド
def certain_block(&block)
yield
end
#メソッドの引数としてブロックを渡し、実行する
certain_block do
p "HelloWorld"
end
=> "HelloWorld"
ブロック引数を省略し、yieldする場合
で、次のパターンはなんと、引数の&blockを省略できます。
このパターンで書くことが多い気がしますが、基本形からこのような形になっていることは押さえておくと良いと思います。
#ブロックを受け取るメソッド
def certain_block
yield
end
#メソッドの引数としてブロックを渡し、実行する
certain_block do
p "HelloWorld"
end
=> "HelloWorld"