ブロックについて

今までブロックについて意識することができていませんでした。

do..endもしくは{}の範囲内って認識でした。

備忘録的として書いておきます。

ブロックとは

上で説明しているようにdo..endもしくは{}の範囲内がブロックです。

languages = %w(Html PHP Ruby)
languages.each do(ここから) |language|
  puts language
end(ここまで)

仮引数としてブロックを受け取る

ブロックに引数を渡して処理をさせることができます。 &をつけることで、ブロックの引数として認識されます。 block.callで戻り値を返します

def section_block(&block)
  puts 'foo'
  puts block.call
end

section_block do
  bar
end
=>foo
=>bar

あくまでもブロックのみ認識するということならば、当然下記でも反応します。

section_block {"bar"}
=>foo
=>bar

{}もブロックなので、成り立ちます

ブロックの戻り値

これは最後に評価された式の値を返します。

section_block do
  'bar'
  'hoge'
end

=>foo
=>hoge

barの中身は評価されてないですね。

wat-aroさんからの指摘を受けて、間違えていたので修正します。

barの中身は評価はされています。

例えば、下記の場合は標準出力に反映されます。

def section_block(&block)
  puts 'foo'
  puts block.call
end

section_block do
  puts 'bar'
  'hoge'
end
=>foo
=>bar
=>hoge

オブジェクトをブロックとして渡す

&をつけることで、Procオブジェクトをブロックとして渡せます。

bar = Proc.new {'bar'}
section_block &bar
=>foo
=>bar

Procオブジェクトはブロックをオブジェクト化したものです。

参考:[Ruby] ブロックやProcの使いどころを理解する - Qiita