数ヶ月前にIronRubyを知るために、IronRuby と matz氏のruby の実行結果を比較をした。
その結果を自分のPCのディスクの肥やしになっていてもしょうがないということで、記載してみようと思う。
基本的に、IronRuby は動くだろうという前提のもと、自分の興味のある部分についてテストしただけなので、まったくもって網羅されてない。
何故そんなことを思ったのかを踏まえて記載出来ればと思う。
基本は、matz氏のruby と IronRuby を比較していたわけですが、この記事を記載するにあたり、せっかくなので IronRuby と ruby 1.8 と ruby 1.9 全てについて調べてみようと思う。
01_puts.rb
puts "hello world" puts ['abc',123,:def,[1,2,3]].inspect
興味のある部分は、inspect の挙動。同じ表現で出てくれるか。
ちなみに inspect 挙動は以下の通り。
instance method Object#inspect inspect -> String オブジェクトを人間が読める形式に変換した文字列を返します。
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\01_puts.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
hello world ["abc", 123, :def, [1, 2, 3]] C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\01_puts.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] hello world ["abc", 123, :def, [1, 2, 3]] C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\01_puts.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 hello world ["abc", 123, :def, [1, 2, 3]]
02_missing.rb
def method_missing( name , *args ) p name p args end xxx(1,2,3)
興味のある部分は、method_missing が呼ばれるか、適切に情報が渡ってくるか
method_missing は以下のような挙動を示すこととなる。
instance method Object#method_missing method_missing(name, *args) -> object 呼びだされたメソッドが定義されていなかった時、Rubyインタプリタがこのメソッドを呼び出します。 呼び出しに失敗したメソッドの名前 (Symbol) が name にその時の引数が第二引数以降に渡されます。 デフォルトではこのメソッドは例外 NameError を発生させます。
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\02_missing.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] :xxx [1, 2, 3] C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\02_missing.rb ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] :xxx [1, 2, 3] C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\02_missing.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 :xxx [1, 2, 3]
03_pp.rb
require 'pp'
pp [1,2,3,4,5,'1'*40,{:a=>1,:b=>[1,2,3]}]
興味のある部分は、ppライブラリが正しくどうさするか(inspectの結果からは正しいと思うけど)及び、ハッシュの記載方法などが処理されるか。(何故テストしたかは不明)
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\03_pp.rb
ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]
[1,
2,
3,
4,
5,
"1111111111111111111111111111111111111111",
{:a=>1, :b=>[1, 2, 3]}]
C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\03_pp.rb
ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
[1,
2,
3,
4,
5,
"1111111111111111111111111111111111111111",
{:a=>1, :b=>[1, 2, 3]}]
C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\03_pp.rb
IronRuby 0.9.1.0 on .NET 2.0.0.0
[1,
2,
3,
4,
5,
"1111111111111111111111111111111111111111",
{:a=>1, :b=>[1, 2, 3]}]
04_each.rb
[1,2,'ab',:xxx,[1]].each do |item| p item p item.class end
興味のある部分は、class メソッドでクラス名が取得できるか
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\04_each.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] 1 Fixnum 2 Fixnum "ab" String :xxx Symbol [1] Array C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\04_each.rb ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] 1 Fixnum 2 Fixnum "ab" String :xxx Symbol [1] Array C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\04_each.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 1 Fixnum 2 Fixnum "ab" String :xxx Symbol [1] Array
05_caller.rb
require 'pp'
def func3
pp caller
end
def func2
func3
end
def func1
func2
end
func1
興味のある部分は、callerの動作について。これはコールスタックを一覧でだしてくれる。何故欲しいか?は想像にお任せします。
module function Kernel.#caller caller(level_num = 1) -> [String] | nil level_num 段上の呼び出し元の情報を $@ の形式のバックトレース(文字列の配列)として返します。 トップレベルでは空の配列を返します。caller の戻り値を $@ に代入することで例外の発生位置を設定できます。 指定した level_num 段上が存在しない場合は nil を返します。
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\05_caller.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] ["mytest/05_caller.rb:8:in `func2'", "mytest/05_caller.rb:12:in `func1'", "mytest/05_caller.rb:15"] C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\05_caller.rb ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] ["mytest/05_caller.rb:8:in `func2'", "mytest/05_caller.rb:12:in `func1'", "mytest/05_caller.rb:15:in `'"] C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\05_caller.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 ["mytest/05_caller.rb:8:in `func2'", "mytest/05_caller.rb:12:in `func1'", "mytest/05_caller.rb:15"]
06_localvar.rb
x=1 y=2 z='abc' local_variables.each do |name| puts name end
興味のある部分は、local_variablesの動作について
module function Kernel.#local_variables local_variables -> [String] 現在のスコープで定義されているローカル変数名の配列を返します。
実行結果
C:\work>\ruby-1.8.7-p72-i386-mswin32\bin\ruby.exe -v mytest\06_localvar.rb ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32] x y z C:\work>\ruby-1.9.1-p0-i386-mswin32\bin\ruby.exe -v mytest\06_localvar.rb ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32] x y z C:\work>\ironruby-0.9.1\bin\ir.exe -v mytest\06_localvar.rb IronRuby 0.9.1.0 on .NET 2.0.0.0 x y z
まとめ?
変態コードを沢山試してきたが、このくらいの変態度合いでは、差異は見つからなかった。すごいぞIronRuby。まぁこのくらいこなしていないと RubyOnRailsは動作しないだろうけど。
ちなみに、もう少し試したコードがあるので、続きは次回にでも。


コメントする