Rubyのブロック構文

Rubyは、「ブロック構文」という機能を標準で備えています。これを使うと、AOPに類似した機能を実現できます。
実際に例を見てみましょう。


まず、「yield」というキーワードを記述したメソッドを定義します。

def testblock
    puts "begin operation";
    yield
    puts "end operation";
end


「yield」の前後で文字列を出力するだけのメソッドです。
次に、上記で定義したメソッドを利用するコードを記述します。

testblock {
    puts "method execution!";
}


実行結果は以下のようになります。

begin operation
method execution!
end operation


しくみを簡単に説明すると、以下のようになります。

  • testblockメソッドの利用者側は、{ }でくくられた「プログラムコード」を引数としています。*1
  • testblockメソッド実行時には、「yield」の部分が引数のコードに置換され、実行されます。

つまり、実行時には以下のようなコードが実行されます。

def testblock
    puts "begin operation";
    puts "method execution!";  # { }で引数として設定したコード
    puts "end operation";
end


通常、メソッドの引数に指定できるのは変数 or 定数ですが、Rubyのブロック構文では「プログラムコード」を引数にできるわけです。ブロック構文を使用することで、たとえば以下のような前処理/後処理を必要とする処理を自動化できます。


Rubyはこういう便利な機能が標準で提供されているのが魅力的ですね。

*1: { }の代わりにdo-endが使用可能です。