2011-04-25 2 views
2

내가 이해하는 한, 스칼라의 함수 유형은 함수 N의 인스턴스로 컴파일됩니다. 예를 들어이 예Scala.NET에서 Scala 클로저가 어떻게 구현됩니까?

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

이이 Scala.NET에서 구현되는 방법

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

의미 그래서? 내가 이해하는 바와 같이, .NET에는 문장 수준의 익명 클래스가 없다. 그리고 위의 해결 방법은 익명의 클래스에 의존합니다.

+0

인터페이스를 올바르게 구현할 수 없습니까? 그래서 그들은이 경우에 정말로 도움이되지 않습니까? – keiter

+0

@Heandel, ** C# **에는 익명 형식이 있지만 이것과 관련이 없습니다. – svick

+0

잘 모르겠지만 Java 바이트 코드에는 익명의 클래스가 없습니다. –

답변

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를 사용하여 반사경에서 컴파일 된 코드를 찾고

노력이 제공 : $anonfun$1Function1 인터페이스를 구현하는 클래스가

int[] numArray1 = new int[] { 1, 2, 3 }; 
List$.MODULE$.apply(new BoxedIntArray(numArray1)).filter(new $anonfun$1()); 

apply() 함수는 다음과 같습니다.

public sealed override bool apply(int x$1) 
{ 
    return (x$1 >= 2); 
}