Как замыкания Scala реализованы в Scala.NET?

Насколько я понимаю, типы Function в 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 нет анонимных классов на уровне операторов. И приведенное выше решение зависит от наличия анонимных классов.


person keiter    schedule 25.04.2011    source источник
comment
Но они не могут реализовать интерфейсы, верно? То есть в данном случае они не помогают?   -  person keiter    schedule 25.04.2011
comment
@Heandel, в C# есть анонимные типы, но они не имеют к этому никакого отношения.   -  person svick    schedule 25.04.2011
comment
Понятия не имею, но в байт-коде Java тоже нет анонимных классов.   -  person Ricky Clarkson    schedule 25.04.2011


Ответы (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);
}
person svick    schedule 25.04.2011