2011-04-25 56 views
2

据我所知,Scala中的函数类型编译为函数N的实例。因此例如本例中在Scala.NET中如何实现Scala闭包?

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

意味着

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

这是如何在Scala.NET实施?据我所知,.NET没有声明级别的匿名类。以上解决方案取决于存在匿名类。

+0

但他们不能实现接口吗?所以他们在这种情况下并没有真正的帮助? – keiter 2011-04-25 14:31:38

+0

@Hanandel,在** C#**中有匿名类型,但他们与此没有任何关系。 – svick 2011-04-25 15:19:52

+0

不知道,但Java字节码中也没有匿名类。 – 2011-04-25 17:49:02

回答

4

我不知道斯卡拉什么,但我不明白为什么不应该被实现的方式为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编译代码,并期待在反射器编译后的代码给出了这样:

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); 
}