本記事では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を引数のカッコ省略と組み合わせた場合などに、ブロックとイテレータがまとめて認識されず、ブロックが無視されるような挙動をするため注意が必要です。

次のページではブロックを引数に取るメソッドを独自に定義する方法、その際の構文や決まり事について解説します。