Ruby/Rubyの基礎知識

ブロックとイテレータ、および手続きオブジェクトProcとlambdaについて

Rubyの特徴的な文法であるブロックとイテレータについて解説を行います。標準イテレータのほか、自分でブロック付きメソッドを定義する方法、そして最後にブロックを手続きオブジェクトとして扱うProcとlambdaについて解説します。

橋本 拓也

執筆者:橋本 拓也

Rubyガイド

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

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

  • 1
  • 2
  • 3
  • 次のページへ

あわせて読みたい

あなたにオススメ

    表示について

    カテゴリー一覧

    All Aboutサービス・メディア

    All About公式SNS
    日々の生活や仕事を楽しむための情報を毎日お届けします。
    公式SNS一覧
    © All About, Inc. All rights reserved. 掲載の記事・写真・イラストなど、すべてのコンテンツの無断複写・転載・公衆送信等を禁じます