2011-04-25 32 views
2

據我所知,Scala中的函數類型編譯爲函數N的實例。因此例如本例中在Scala.NET中如何實現Scala閉包?

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

意味着

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

這是如何在Scala.NET實施?據我所知,.NET沒有聲明級別的匿名類。以上解決方案取決於存在匿名類。

+0

但他們不能實現接口嗎?所以他們在這種情況下並沒有真正的幫助? – keiter 2011-04-25 14:31:38

+0

@Hanandel,在** C#**中有匿名類型,但他們與此沒有任何關係。 – svick 2011-04-25 15:19:52

+0

不知道,但Java字節碼中也沒有匿名類。 – 2011-04-25 17:49:02

回答

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編譯代碼,並期待在反射器編譯後的代碼給出了這樣:

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