Как реализованы замыкания Scala в Scala.NET? - PullRequest
2 голосов
/ 25 апреля 2011

Насколько я понимаю, типы функций в 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 Ответ

4 голосов
/ 25 апреля 2011

Я ничего не знаю о 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 вместе с анонимной функцией.

EDIT:

Я только что попытался скомпилировать ваш код с использованием 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);
}
...