ブロック
Rubyにおいて、処理と、その処理で使う値を定義したもの。
オブジェクトではない、Rubyの仕様の一つ。
コード上では
code:block
do |x|
end
または
code:block
{ |x|
}
と表記される。
ブロックは、メソッドに渡すことができる。
(というか、メソッドに渡す形式以外でブロックは存在できない。「メソッドに渡すコードの塊をブロックと呼ぶ」とも言える。)
が、これはメソッドの引数ではない。
通常のメソッド定義における引数とは別のRubyの機構である。
ただし、メソッドの定義の中の、最後の引数に&をつけたものはブロック引数と呼ばれ、「そのメソッドに渡されたブロックをProcクラスのインスタンスに変換したもの」が代入される。 メソッドに渡されたブロックは、メソッド内で予約語yieldで呼び出すことができる。 例えば
code:block_try.rb
def block_try
puts "渡されたブロックを実行します。"
yield
puts "渡されたブロックの処理が終了しました。"
end
block_try {
puts "これがブロックの処理です。"
}
code:console
$ ruby block_try.rb
渡されたブロックを実行します。
これがブロックの処理です。
渡されたブロックの処理が終了しました。
さらに、ブロック変数を使えば、ブロックの中の処理に、メソッドの内部から値を渡すことができる。 code:block_params_try.rb
def block_try
random_number = rand(10)
puts "ランダムに生成された数字は#{random_number}です。"
puts "渡されたブロックに、今生成した値を渡して実行します。"
yield(random_number)
puts "渡されたブロックの処理が終了しました。"
end
puts "---------------try1---------------"
block_try { |x|
puts "これがブロックの処理です。"
puts "与えられた数字を2倍にしてputsします。"
puts x * 2
}
puts "---------------try2---------------"
block_try { |x|
puts "これがブロックの処理です。"
puts "与えられた数字に100を足してputsします。"
puts x + 100
}
code:console
$ ruby block_params_try.rb
---------------try1---------------
ランダムに生成された数字は2です。
渡されたブロックに、今生成した値を渡して実行します。
これがブロックの処理です。
与えられた数字を2倍にしてputsします。
4
渡されたブロックの処理が終了しました。
---------------try2---------------
ランダムに生成された数字は9です。
渡されたブロックに、今生成した値を渡して実行します。
これがブロックの処理です。
与えられた数字に100を足してputsします。
109
渡されたブロックの処理が終了しました。