参照の追加
以下のように参照を追加した。

ソースコード
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();
}
}
}
解説
engine.CreateScope();でスコープを作りそこに変数を設定していく。なお、グローバル変数はIronRuby.Ruby.GetExecutionContext(engine).DefineGlobalVariableを用い定義する。この時、rubyの命名規則 $ を先頭につける必要はないようである。あと「runtime.Globals.SetVariable("xxx", 567);」なる記述方法もあるらしいが、この方法は利用できないようである。
次に、スクリプト文字列からソースを作り、そのソースに先ほど生成&設定したスコープを渡し実行している。
「var source = engine.CreateScriptSourceFromString(@"puts ""x is #{x}. $xxx is #{$xxx}."" ");
」以外にも「var source = engine.CreateScriptSourceFromString("puts \"x is #{x}. $xxx is #{$xxx}.\" ");」や「var source = engine.CreateScriptSourceFromString(@"puts %!x is #{x}. $xxx is #{$xxx}.! ");」というようにして、ソースを渡す方法があるかと思う。
個人的には、最後の %!?!で囲む方式がすっきりしてていいような気もする。
さいごに
様々なバージョンのIronRubyを呼び出してみたが、今回の記述はすっきりしていると感じている。
なお上記コードはIronRubyな人に見てもらい、goodとの返事をいただいております。
詳細については、別途記載したいとおもいます。


コメントする