前回にC#からIronRubyスクリプトの呼び出し方法についていろいろ書いたが、もうちょっと詳しくみてみる。
より詳細なホスティングの仕方
以前のコードは次のようになっていたかと思う。
using System;
using Microsoft.Scripting.Hosting;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
// IronRubyエンジンオブジェクトの生成
ScriptRuntime runtime = IronRuby.Ruby.CreateRuntime();
var engine = runtime.GetEngine("rb");
// 変数スコープの生成 と 変数への値の設定
var scope = engine.CreateScope();
scope.SetVariable("x", 123);
// グローバル変数への設定
IronRuby.Ruby.GetExecutionContext(engine).DefineGlobalVariable("xxx", 789);
//スクリプトの実行
var source = engine.CreateScriptSourceFromString(@"puts %!x is #{x}. $xxx is #{$xxx}.! ");
source.Execute(scope);
Console.ReadLine();
}
}
}
基本的にこのコードで良かったのだが、もう少しきれいに書けるという事が分かったので記載しておく。
エンジンオブジェクトの生成
エンジンオブジェクトを以下のように生成していた。
// IronRubyエンジンオブジェクトの生成
ScriptRuntime runtime = IronRuby.Ruby.CreateRuntime();
var engine = runtime.GetEngine("rb");
よくよく見るとこのコードは不思議で、rumtime を生成し、そのあとエンジンを生成している。ここで、runtime は IronRuby.Ruby と名指しで指定してるにもかかわらず、そのあと engine は、文字列を使った取得をしている。
この2つの違和感をとるために以下のような記述が出来るという事がわかった
// IronRubyエンジンオブジェクトの生成
var engine = IronRuby.Ruby.CreateEngine();
逆に、IronRuby.Ruby という固有修飾を避けたいのであれば以下のように書くこともできる。
// IronRubyエンジンオブジェクトの生成
var engine = ScriptRuntime.CreateFromConfiguration().GetEngine("rb");
この場合、他のスクリプトエンジンも利用できるようになる。
今回は、IronRubyのみなので前者でエンジンを作成することとする。
ScriptSource
ソースから評価するにも2種類あるらしい。基本的に「スコープ」を作成し、そのスコープを用いて評価であるが
// 変数スコープの生成 と 変数への値の設定
var scope = engine.CreateScope();
scope.SetVariable("x", 123);
この部分は共通。
評価するに当たり
var source = engine.CreateScriptSourceFromString(@"puts %!x is #{x}.! ");
source.Execute(scope);
一旦スクリプトソースを生成し、それにスコープを渡して実行する方法。
engine.Execute(@"puts %!x is #{x}.! ",scope);
直接エンジンにソースとスコープを渡し、実行する方法。
この2つがある。前者は、スクリプトソースを生成した時点でrubyソースのコンパイルがされているために、同じrubyソースを実行するのであれば、コンパイルの必要がない。後者の場合には、シンプルに記述できるが、毎回コンパイルが走る。さらに、前者の場合、細かい実行モードやrubyスクリプトのコンパイルエラー検出が出来たりするらしい。
まとめ
このように IronRuby をホスティングするには数種類の方法が存在している。時と場合に分けて利用するのが良いかと考える。


コメントする