原文地址:http://blog.sina.com.cn/s/blog_4513dde60101deda.html
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:xialulee
最初发布于:2011年12月20日,http://blog.sina.com.cn/xialulee
% 2011.12.20 PM 09:50
% Matlab 7.12.0
% IronPython 2.7.1
% xialulee
NET.addAssembly('IronPython');
import IronPython.Hosting.*
engine = Python.CreateEngine();
scope = engine.CreateScope();
engine.CreateScriptSourceFromSt ring('f = lambda x: x+3').Execute(scope);
f = NET.invokeGenericMethod(scope, 'GetVariable', ...
{NET.GenericClass('System.Func', 'System.Object', 'System.Object')}, 'f');
fprintf('f(2) = %d\n', f(2));
% output: f(2) = 5
稍微解释一下。创建IronPython的engine和scope,这些都不用说了。关键是scope的GetVariable方法,这个方法有Generic和non-Generic两个版本,其中Generic版本能够实现类型的转换,比如获取一个Python的callable对象时,其Generic的版本能够直接返回一个delegate。上面的例子中,在scope里用lambda创建了一个函数f,它有一个参数x。如果调用GetVariable时指定type parameter为Func<object, object>,则返回值为IronPython中的函数f对应的delegate对象。之所以Func中有两个object,是因为第一个object代表的是参数,第二个是返回值。