2016-03-08 30 views
0

我試圖區分兩個數組。具體來說,我有一個數組與一些字符串,另一個索引,我想從第一個數組清理。起初,我試圖用「_」來使用匿名函數註釋,但它不起作用,而且我很難理解爲什麼。 下面是一個例子:Scala中的匿名函數,錯誤取決於表示法

val a1 = Array("word1","word2","word3") 
val ind = Array(1,2) 
val a2 = a1.zip(a1.indices) 

val not_working = a2.filterNot(ind.contains(_._2)) 

> console>:15: error: missing parameter type for expanded function 
> ((x$1) => x$1._2) 
>   a2.filterNot(ind.contains(_._2)) 
>         ^<console>:15: error: type mismatch; 
> found : Boolean required: ((String, Int)) => Boolean 
>   a2.filterNot(ind.contains(_._2)) 

我的假設是,_對應於,例如,( 「字詞1」,0)或( 「單詞2」,1)元組。但我不明白這個錯誤,爲什麼它會在這裏得到布爾類型?我雖然會得到元組的第二部分。

只是爲了它,我試圖更明確地重寫它,它的工作。下面是一個例子,做什麼,我想到的,我天真的眼睛,它看起來像我改變的僅僅是符號:

val working = a2.filterNot(x => ind.contains(x._2)) 

我有很難理解兩個例子之間的差異。爲什麼第二個工作?

回答

1

有兩個錯誤堆疊在彼此的頂部上:

val not_working = a2.filterNot(ind.contains(_._2)) 

第一個錯誤是missing parameter type for expanded function。實質上,_語法不能在任何地方使用,這是其中的一種情況。 (在這種情況下,這是因爲佔位符語法不能在嵌套圓括號內使用

第二個錯誤是編譯器不理解您嘗試使用佔位符語法的結果,但它仍然知道ind.contains返回一個布爾這是錯誤消息指出:。found: Boolean編譯器認爲一個布爾值傳遞給filterNot,但filterNot需要一個功能T => Boolean

一旦語法問題是固定的,編譯器能夠正確解析表達式和你的榜樣編譯

0

正如它提到的herehere和多個其他地方

佔位符語法匿名功能替換爲函數的最小 可能含有表達。

所以

a2.filterNot(ind.contains(_._2)) 

將脫到

a2.filterNot(ind.contains(x => x._2))