2017-02-10 47 views
2

使用表達 「_ =>」 下面的代碼是不工作:不能在斯卡拉

val neighbors = ('a', List(1,2,3)) #:: ('b', List(2,3,4)) #:: ('c', List(3,4,5)) #:: Stream.empty 
neighbors.count(_ => _._1 == 'a')) 

不過,我可以這樣做:

neighbors.count(_._1 == 'a') 

或:

neighbors.count(elem => elem._1 == 'a') 

這兩個有效的解決方案。

問題:「_ =>」有什麼問題?

非常感謝你

回答

6

有什麼不對_ =>

沒什麼是錯了與它。它對編譯器具有特殊的含義。這意味着「我想忽略此值」。它是有道理的,如果你想忽略它,你想能夠應用任何操作。它與placeholder語法如何具有特殊含義相似。

你可以這樣做:

neighbors.count(_._1 == 'a') 

因爲這是由規格爲匿名函數的佔位符語法,它擴展到

neighbors.count(x => x._1 == 'a') 

我找不到任何正式的關於這個每個定義但它確實在6.23 Anonymous Functions下提供了此示例:

_ => 5        // The function that ignores its argument 
            // and always returns 5. 

我還在舊的Scala語言郵件列表中發現了this post

1

「_」符號用於製作匿名函數。下面的代碼:

neighbours.count(_._1 == 'a') 

轉化爲

neighbours.count(x => x._1 == 'a') 

如果有兩個或兩個以上的下劃線,編譯器試圖與更多的參數推導功能:

val numbers = List(1, 3, 4, 5, 6) 
numbers.reduce(_ * _) 

上面的代碼轉換到:

numbers.reduce((x1, x2) => x1 * x2) 

它現在應該是顯而易見的,有改造沒有明確的辦法:

_ => _.1 == 'a' 

Becouse就需要生產函數有兩個參數。 可以想見做轉型是這樣的:

x1 => x2 => x2._1 == 'a' 

Scala編譯器甚至會擴大這一定義,但COUNT函數願與下面簽名功能:T => Boolean,不T => T => Boolean

例如,下面的編譯:

val test: Int => Int => Boolean = _ => _ == 3 
+0

*因爲它需要產生帶有兩個參數的函數。*爲什麼?該語言本身可以說'_ =>'只是簡單地將'_'綁定到一個新的變量名,類似於'_._ 1'的工作方式。 –

+0

我認爲'_._ 1'只是產生一個函數'x => x._1',同樣'_ => c'產生函數'x => c'',其中c是一個獨立於x的表達式。 –