如何在Scala.NET中实现Scala闭包?

时间:2011-04-25 14:21:41

标签: .net scala closures anonymous-class

据我了解,Scala中的函数类型编译为 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没有语句级匿名类。以上解决方案取决于是否存在匿名类。

1 个答案:

答案 0 :(得分:4)

我对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接口的类,其apply()函数如下所示:

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