当前位置: 首页 > 编程语言 > C#

如何使用C#方法使用IronRuby块Share

时间:2023-04-11 01:42:09 C#

如何使用C#方法使用IronRuby块这是我试图模拟的基本Ruby代码:defBlockTest()result=yield("hello")putsresultendBlockTest{|x|x+"world"}我尝试用C#和IronRuby做同样的事情是:stringscriptText="csharp.BlockTest{|arg|arg+'world'}n";脚本引擎scriptEngine=Ruby.CreateEngine();ScriptScopescriptScope=scriptEngine.CreateScope();scriptScope.SetVariable("csharp",newBlockTestClass());scriptEngine.Execute(scriptText,scriptScope);BlockTestClass是:publicclassBlockTestClass{publicvoidBlockTest(Funcblock){Console.WriteLine(block("hello"));当我运行C#代码时,我得到一个异常:参数数量错误(1为0)如果我将IronRuby脚本更改为以下内容,它可以正常工作。stringscriptText="csharp.BlockTestlambda{|arg|arg+'world'}n";但是我如何让它与原始的IronRuby脚本一起工作,以便它等同于我的原始Ruby示例?stringscriptText="csharp.BlockTest{|arg|arg+'world'}n";Ruby的块不是c#(或任何其他.Net语言)理解的概念。要在c#ofdelegates中“传递”类似的概念,您必须将其“包装”在可理解的内容中。通过将lambda从块中取出,它可以传递给需要委托或表达式的c#代码。这是'Alt.Net'社区中的一个常见问题,即使对于像f#这样的受祝福的语言,其中'函数指针'没有实现为委托,但略有不同(例如f#中的FastFunc实例)将其中一个传递给像您这样的c#示例需要将其包装在委托中(字面意思是创建一个委托,其调用将参数传递给基础实例并返回结果)。有人可能会争辩说,这种转换如果是自动的会更好,但这样做会导致复杂和奇怪的边缘情况或错误,而且许多开发人员更愿意知道这种包装操作只会通过查看代码来实现。合理的转换也有可能并不总是存在(或者存在多个转换),因此让用户决定发生什么是合理的默认设置。在大多数情况下,IronRubyProcs和lambda可以与CLRActions、Funcs、委托类型和动态对象互换。然而,除了一些调用站点转换之外,除此之外几乎没有Ruby语法糖。有一次,我们确实改进了.NET事件的语法;IronRuby允许将Ruby块作为CLR事件处理程序传递:button.on_click{|s,e|...}button.on_click{|s,e|...}。我们尝试了多种方法来允许将块传递给CLR方法;通过检测最后一个参数是可调用对象的方法,或通过允许特殊命名的参数。有一个功能请求(尽管以密码命名)打开:http://ironruby.codeplex.com/workitem/4511。对于任何愿意贡献的人来说,这将是一个很好的挑战。您可以完全在c#中使用ruby??块,事实上我已经在当前生产的应用程序中使用过它!这是这样的:在c#文件中:publicvoidBlockTest(dynamicblock){Console.WriteLine(block.call("world"));在Ironruby中:#requiretheassemblyblock=Proc.new{|i|"hello"+i}Blah::Blah.BlockTestblock注意:仅在c#4.0中测试以上为C#学习教程:HowtousetheC#IronRuby块的使用方法分享所有内容,如果对大家有用还需要了解更多C#学习教程,希望大家多多关注~本文收集自网络,不代表正文位置。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: