maeshimaの日記

メモ書きです

メタプログラミングRuby 第5章

eval

  • instance_evalやclass_evalも、evalと同じように文字列を引数にすることが出来る。
  • evalとセーフレベルと汚染の考えはワンセット。

Binding

TOBLEVEL_BINDING
トップレベルのスコープが束縛されている

eval で実行時の束縛を指定できる。どっかで使えそうな気がする…

サンドボックス

proc {
  $SAFE = @safe_level
}.call

ってやると、Procの中だけセーフレベルが変わる...ってマジで?と思ったので試した。

proc {$SAFE= 1}.call #=> 1 
$SAFE #=> 0 

マジだった。調べると、$SAFE はスレッドローカル変数といって、スレッド毎のスコープらしい。でも procってスレッドじゃないし・・・と思ったらちゃんとマニュアルに書いてあった

Procはその時点でのセーフレベルを記憶する そのProcオブジェクトがcallされると、 記憶していたセーフレベルで実行される。

http://www.ruby-lang.org/ja/man/html/_A5BBA5ADA5E5A5EAA5C6A5A3A5E2A5C7A5EB.html

フックメソッド

included はよく使うけど、他はどれくらいの数あるんだろう?そしてどのように使うべきだろう?