ブロックについて
今までブロックについて意識することができていませんでした。
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オブジェクトはブロックをオブジェクト化したものです。