2011-10-02 48 views
69

我知道這方面有很多問題,但我創建了一個我認爲應該可以工作的簡單例子,但仍然沒有,我也不確定我明白爲什麼斯卡拉下劃線 - 錯誤:缺少擴展功能的參數類型

val myStrings = new Array[String](3) 
// do some string initialization 

// this works 
myStrings.foreach(println(_)) 


// ERROR: missing parameter type for expanded function 
myStrings.foreach(println(_.toString)) 

有人可以解釋爲什麼第二個語句不編譯?

+3

更簡單:'myStrings.foreach(println)' –

回答

90

它擴展爲:

myStrings.foreach(println(x => x.toString)) 

你想:

myStrings.foreach(x => println(x.toString)) 

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

+1

類似:http://stackoverflow.com/questions/5981732/scala-underscore-use-to-simplify-syntax-of-function-literals http:// stackoverflow.com/questions/5259006/underscore-in-named-arguments – retronym

+0

爲什麼'myStrings.foreach(println(_))'自動爲'println'的參數包含'toString'? –

+0

@Kevi Meredith println調用傳遞給對象的toString() – krookedking