Rubyではメソッドを実行する時に引数としてブロックdo end
をつけて実行する関数がある。例えばmap
メソッドなど。
例えばmapメソッドを作成しようと思ったら、引数として受け取ったメソッドを実行させる必要がある。
それがyield
、もしくはcall
で呼ぶやり方だ。
def hoge(&block)
# .callの場合
if not block.nil?
block.call "hogehoge"
end
# yieldの場合。
if block_given?
yield "hogehoge"
end
end
hoge do |text|
puts text
end
# -> hogehoge
またブロックとはProc
オブジェクトである。以下のようにしても同様の処理ができる
# Proc.new
sample_proc = Proc.new do |text|
puts text
end
# lambda
sample_lambda = -> (text) {
puts text
}
hoge &sample_proc
hoge &sample_lambda