IronRuby を使ってみた
仕事で C# を使うことになったので「Ruby on Windows」を見ながら RubyCLR を試してみた。
ところが Ruby 1.9.1 に対応していないらしく、require すると SyntaxError が出る。
case when: ...
when の : をひたすら ; に置換するなどした。
それでも activesupport 絡みでエラーが出る*1ので諦めた。
そこで IronRuby ですよ
IronRubyは、.NET Framework上で動作する、マイクロソフトによるRubyの実装である。
(Wikipedia より)
http://ironruby.net/ からバイナリをダウンロードして適当なディレクトリに展開。
bin/ir.exe というのが本体らしい。
$ ir /path/to/IronRuby/bin/ir: line 5: mono: command not found
なんじゃこりゃー。
$ cat /path/to/IronRuby/bin/ir #!/usr/bin/env bash fpath=`which $0` fdir=`dirname $fpath` mono $fdir/ir.exe $*
なにこれ、うける。
拡張子も指定して ir.exe を起動する。
$ ir.exe IronRuby 0.9.3.0 on .NET 2.0.0.0 Copyright (c) Microsoft Corporation. All rights reserved. >>>
MRI はスクリプト全体をパースしてから実行するけど、IronRuby はスクリプトを逐次読み込んで実行するらしい。
ir.exe に標準入力からコードを与えると対話的に実行してくれる。
>>>puts 'Hello IronRuby' Hello IronRuby => nil >>> require 'System' => true >>> System::Console.WriteLine 'Hello .NET' Hello .NET => nil
もうちょっと複雑なのも試してみる。
require 'System' require 'System.Data' con = System::Data::SqlClient::SqlConnectionStringBuilder.new con.DataSource = '(local)' con.UserID = 'scott' con.Password = 'tiger' db = System::Data::SqlClient::SqlConnection.new db.ConnectionString = con.to_s begin db.Open sql = db.CreateCommand sql.CommandText = "SELECT 'Hello SQL' FROM DUAL" sql.ExecuteReader.each do |rec| System::Console.WriteLine rec[0] end ensure db.Close end #> Hello SQL
う〜ん、気持悪い。
もうちょっと Ruby らしく書けないもんだろうか。
例えば IDisposable なクラスなら C# で using が使えるように、ブロック付きメソッドで自動解放してくれるとか。
なんか .NET のクラスをそのまま見せてくれてるだけで、ちっとも嬉しくない。
Ruby っぽいラッパークラスとかないのかなぁ。
String (Ruby) と System::String (.NET) さえも区別してる。
>>> con.to_s => "Data Source=(local);User ID=scott;Password=tiger" >>> con.ToString => 'Data Source=(local);User ID=scott;Password=tiger' >>> con.to_s.class => String >>> con.ToString.class => System::String
やっぱり Microsoft との間には埋められない溝があるのか知らん。
*1:MissingSourceFile って何だ?