2

私が理解しているように、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にはステートメントレベルの匿名クラスがありません。そして、上記の解決策は、匿名のクラスがあることに依存しています。

4

1 に答える 1

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を実装するクラスはどこにあり、その関数は次のようになります。Function1apply()

public sealed override bool apply(int x$1)
{
    return (x$1 >= 2);
}
于 2011-04-25T15:19:10.217 に答える