2012-07-23 86 views
3

斯卡拉語法所以這個編譯:的lambda函數

def compress[T](list: List[T]): List[(T, Int)] = 
{ 
    list.zipWithIndex.filter { tuple => (tuple._2 == 0) || (tuple._1 != list(tuple._2 - 1)) } 
} 

這並不編譯:

def compress[T](list: List[T]): List[(T, Int)] = 
{ 
    list.zipWithIndex.filter { (_._2 == 0) || (_._1 != list(_._2 - 1)) } 
} 

爲什麼?

回答

14

_並不意味着x。相反,它意味着「使用參數列表中的下一個參數」或「將此方法轉換爲函數對象」,具體取決於上下文。在你的情況下,第二個是廢話,因爲你想要一個變量的功能,但使用三次。

提示:使用xt。拼寫出tuple不可能幫助任何人,並且單字母版本與_一樣緊湊。更重要的是,

filter { case (t,i) => (i==0) || (t != list(i-1)) } 
+2

我總是使用'​​case(x,y)'語法,但't2','t3'也是很好的替代品 – 2012-07-23 09:40:06

2

你的第二個例子擴展爲:

def compress[T](list: List[T]): List[(T, Int)] = 
{ 
    list.zipWithIndex.filter { ((x => x._2) == 0) || ((y => y._1) != list((z => z._2) - 1)) } 
} 

,編譯器正確地拒絕爲荒謬的。包含_的呼叫擴展到只有的的lambda,沒有別的。

+1

我認爲最後一部分其實是'(x => x._2 = = 0)|| (y => y._1!= list(z => z._2 - 1))'。 – 2012-07-23 08:12:33