这是动态语言运行时应该做的两件事之一:每个人都认为DLR仅适用于语言实现者,以使在CLI上更轻松地实现动态语言。但是,也使应用程序编写者更容易在其应用程序中托管动态语言。
在DLR之前,每种语言都有自己的托管API。现在,DLR具有标准化的托管规范,适用于每种 语言,并且支持C#4和VB.NET 10中的动态类型对象,它比以往任何时候都更加容易:
// MethodMissingDemo.cs
using System;
using IronRuby;
class Program
{
static void Main()
{
var rubyEngine = Ruby.CreateEngine();
rubyEngine.ExecuteFile("method_missing_demo.rb");
dynamic globals = rubyEngine.Runtime.Globals;
dynamic methodMissingDemo = globals.MethodMissingDemo.@new();
Console.WriteLine(methodMissingDemo.HelloDynamicWorld());
methodMissingDemo.print_all(args);
}
}
# method_missing_demo.rb
class MethodMissingDemo
def print_all(args)
args.map {|arg| puts arg}
end
def method_missing(name, *args)
name.to_s.gsub(/([[:lower:]\d])([[:upper:]])/,'\1 \2')
end
end
在这里,您会看到东西在各个可能的方向传播。C#代码正在Ruby对象上调用一个 甚至不存在的方法 ,并且Ruby代码正在.NET数组上进行迭代并将其内容打印到控制台。