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のブロック構文では「プログラムコード」を引数にできるわけです。ブロック構文を使用することで、たとえば以下のような前処理/後処理を必要とする処理を自動化できます。
- ファイルのopen/close
- DB接続時のコネクションのopen/close
- トランザクションのbegin/end
Rubyはこういう便利な機能が標準で提供されているのが魅力的ですね。
*1: { }の代わりにdo-endが使用可能です。