From: Masatoshi SEKI Date: 2007-04-10T00:27:15+09:00 Subject: [ruby-dev:30705] ruby-1.8.6, $SAFE=4, Proc#call 咳といいます。 一度、まつもとさんには私信で質問したのですが、せっかくなのでMLにも投げます。 Proc#callとyieldで、Procが実行される際の$SAFEが異なります。 まつもとさんはProc#callの挙動が意図したものである、とのことでした。(あってますか?>まつもとさん) yieldの挙動をProc#callと揃える予定はありますか? スレッドを作って$SAFE = 4でなにかを実行するのにyieldをよく使っていたのですが、 yieldもProc#callの挙動に揃えるとすると、ちょっと面倒です。 --- $SAFE=4のスレッドからProc#callした場合、Procを作ったコンテキストのsafe_levelで Procが実行されるようです。yieldする場合には、safe_levelが引き継がれます。 これは意図した動作でしょうか? なんとなくバグな気がします。 例えばこんなスクリプトで実験できます。 four_procの方は$SAFE=4のはずなのに標準出力に印字できます。 ## safe.rb def four_proc(&block) Thread.new { $SAFE = 4; block.call }.join end def four_yield Thread.new { $SAFE = 4; yield }.join end four_proc { p :proc } four_yield { p :yield } ## 実行結果 cinq:~/develop/labo/ruby/misc mas$ ruby safe.rb :proc safe.rb:10:in `write': Insecure operation `write' at level 4 (SecurityError) from safe.rb:6:in `join' from safe.rb:6:in `four_yield' from safe.rb:10