本記事ではRubyにおけるブロック、ブロック付きメソッドの定義、そしてブロックをオブジェクトとして扱うことのできるProcとlambdaを紹介します。
ブロックとイテレータ
ブロックとは、単純に言えば「コードのかたまり」です。Rubyにおいては do ... end
で囲われたところがブロックとなります。簡単な例を見てみましょう。
do puts 'hoge' end
の箇所が「ブロック」と呼ばれます。ちなみに以下のようにブロックだけで存在することは出来ません。
このブロックに対してイテレータで操作を指定します。最初の例で言うとtimes
がイテレータで、ブロック内のコードを"10回繰り返す"(10 times do something)ように指示しています。10回「puts 'hoge'
」と書く代わりに共通部分をブロックに押しこめ、それをイテレータで好きなように操作している、という構図です。
イテレータ(iterator: 反復子)という呼び名はRubyにおいてはややミスマッチであり、「ブロック付きメソッド」「ブロックが渡されることを想定したメソッド」とでも表現したほうが正確かもしれません。ともかく、イテレータはブロックを引数に取ります。
イテレータによっては、ブロックに外から変数を渡すことができます。次はeachイテレータの例です。
ブロック内のコードにはn
という変数が含まれているため、nを知ることで実行されるコードが決定されます。ブロック引数は|n|
というように、|
で囲うことで表現できます。
do...endと波括弧の違い
なお、do ... end
の代わりに{ ... }
と波括弧で書いてもほぼ同じ意味になります。唯一の差異は実行の優先順位で、例えばdo...end
を引数のカッコ省略と組み合わせた場合などに、ブロックとイテレータがまとめて認識されず、ブロックが無視されるような挙動をするため注意が必要です。
次のページではブロックを引数に取るメソッドを独自に定義する方法、その際の構文や決まり事について解説します。