IronRuby を使ってみた

仕事で C# を使うことになったので「Ruby on Windows」を見ながら RubyCLR を試してみた。

Rubyist Magazine出張版 Ruby on Windows

ところが 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 って何だ?