2011-10-02 49 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