2011-10-02 9 views
69

Sé que ha habido bastantes preguntas sobre esto, pero he creado un ejemplo simple que pensé que debería funcionar, pero todavía no y no estoy seguro Entiendo por quéScala subrayado - ERROR: tipo de parámetro faltante para la función ampliada

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)) 

¿Alguien puede explicar por qué la segunda declaración no se compila?

+3

Aún más simple: 'myStrings.foreach (println)' –

Respuesta

90

se expande a:

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

que desea buscar:

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

La sintaxis marcador de posición para funciones anónimas sustituye a la más pequeña de expresión que contiene posible con una función.

+1

Similar: 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

¿Por qué 'myStrings.foreach (println (_))' incluye automáticamente 'toString' para el argumento' println'? –

+0

@Kevi Meredith println llama a toString() de cualquier objeto que se pase – krookedking

Cuestiones relacionadas