引き続き IronRuby と MRI の比較を行いたいと思う。
動的に評価する際に必要となりそうな部分についての確認をする
07_eval.rb
a = 10 b = 20 str = "puts a+b" eval( str )
興味のある部分は、evalの動作について。つまり動的に文字列を評価できるのか
module function Kernel.#eval eval(expr) -> object eval(expr, bind, fname = __FILE__, lineno = 1) -> object 文字列 expr を Ruby プログラムとして評価してその結果を返します。第2引数に Proc オブジェクトまたは Binding オブジェクトを与えた場合、そのオブジェクトを生成したコンテキストで文字列を評価します。 expr の中のローカル変数の扱いはブロックの場合と同じです。すなわち、eval 実行前に補足されていた変数は eval 実行後にブロック外に持ち出せます。
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\07_eval.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] 30 C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\07_eval.rb ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] 30 C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\07_eval.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 30
08_binding.rb
require 'pp' def func3 a = 100 b = 200 binding end def func2 func3 end def func1 func2 end bind = func1 a = 10 b = 20 str = "puts a+b" eval( str ) eval( str , bind )
興味のある部分は、bindingの動作について
module function Kernel.#binding binding -> Binding 変数・メソッドなどの環境情報を含んだ Binding オブジェクトを生成して返します。通常、Kernel.#eval の第二引数として使います。
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\08_binding.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] 30 300 C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\08_binding.rb ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] 30 300 C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\08_binding.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 30 300
結論
この範囲においても差分がないようだ。良いことだ。
これ以外にも Thread の挙動について調べたが、それは以前に書いた通りなので割愛


コメントする