2013年6月25日火曜日

メタプログラミングRuby勉強会#3

スコープ

Rubyのスコープは、class / module / defの3つのスコープゲートで区切られている
スコープゲートを超えるとスコープが切り替わる。それを超えるにはグローバル変数を使う(当然あまり使わない)、またはスコープのフラット化を使う。

スコープのフラット化の例

普通に書くと次の例はクラス内でaという変数は見えない → エラーになる。

ここで、classを超えるにはClass.newを使う

しかし、まだdefの壁(ゲート)を超えられない.
これを超えるにはdefine_methodを使う。

instance_eval

instance_evalに渡したブロックはselfオブジェクトと同じコンテキストで評価される。
要するにインスタンス変数にアクセスしたり、変更できる。このブロックをコンテキスト探査機を呼ぶ。

Procとlambda

returnの動作と引数の扱いの2つの観点からlambdaの方が使いやすそう。
Proc内のreturnは、Procが定義されたスコープから戻るのでバグとなりやすい。


ブロック、スコープのフラット化、lambdaを使って簡単にDSL書けそう。

0 件のコメント:

コメントを投稿