【问题标题】:How are Scala closures implemented in Scala.NET?Scala 闭包是如何在 Scala.NET 中实现的?
【发布时间】:2011-04-25 14:21:41
【问题描述】:

据我了解,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 没有语句级匿名类。而上述解决方案依赖于匿名类。

【问题讨论】:

  • 但是他们不能实现接口对吧?所以他们在这种情况下真的没有帮助吗?
  • @Heandel,C#中有匿名类型,但与此无关。
  • 不知道,但Java字节码中也没有匿名类。

标签: .net scala closures anonymous-class


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 2017-07-04
    • 2022-01-10
    • 2021-10-15
    • 2016-04-04
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多