.net - Scala 闭包在 Scala.NET 中是如何实现的?

标签 .net scala closures anonymous-class

据我了解,Scala 中的 Function 类型会编译为 FunctionN 的实例。例如这个例子

List(1,2,3).filter(_ >= 2)

表示

List(1,2,3).filter(new Function1[Int,Bool]{def apply(_$1:Int) = _$1 >= 2;})

这是如何在 Scala.NET 中实现的?据我了解,.NET 没有语句级匿名类。而上述解决方案依赖于匿名类的存在。

最佳答案

我对 Scala 一无所知,但我不明白为什么不应该以与 C# 闭包相同的方式实现它,即以下代码:

new List<int>{1,2,3}.Where(i => i >= 2)

这段代码是通过在当前类中创建一个新函数来实现的。如果你真的创建了一个闭包:

int max = 2;
var result = new List<int> { 1, 2, 3 }.Where(i => i >= max);

这可以通过创建一个包含变量 max 以及匿名函数的新类来实现。

编辑:

我刚刚尝试使用 Scala.Net 编译您的代码,并在 Reflector 中查看编译后的代码,结果如下:

int[] numArray1 = new int[] { 1, 2, 3 };
List$.MODULE$.apply(new BoxedIntArray(numArray1)).filter(new $anonfun$1());

其中 $anonfun$1 是一个实现 Function1 接口(interface)的类,其 apply() 函数如下所示:

public sealed override bool apply(int x$1)
{
    return (x$1 >= 2);
}

关于.net - Scala 闭包在 Scala.NET 中是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779279/

相关文章:

arrays - 在scala中,如何找到数组元素的大小

javascript - 编写一个遍历二叉树的迭代器

.net - ESP8266 - .Net 可行吗?

scala - 通过嵌套函数或多个参数列表进行scala curring

c# - 阻塞的线程占用了哪些资源

scala - 无法在 Chisel3 中使用 PeekPokeTester 打印

javascript - 我可以使用 JavaScript 闭包添加数字吗?

javascript - JavaScript 中的闭包

c# - MessageBox.Show中的参数MessageBoxResult defaultResult是做什么用的?

c# - 我怎样才能 "un-JsonIgnore"派生类中的属性?