スコープ
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 件のコメント:
コメントを投稿