imajoriri
3/9/2019 - 12:29 AM

ブロックとProcについて

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オブジェクトである。以下のようにしても同様の処理ができる

# Proc.new
sample_proc = Proc.new do |text|
  puts text
end

# lambda
sample_lambda = -> (text) {
  puts text
}

hoge &sample_proc
hoge &sample_lambda