2012-01-04 11 views
6

Uno de los problemas con los que me encuentro continuamente con scala es con las expresiones lambda '. Por ejemplo"Falta el tipo de parámetro para la función expandida" cuando se usa _ (guion bajo)?

JarBuilder.findContainingJar(clazz).foreach {userJars = userJars + _ } 

me da un error como:

missing parameter type for expanded function ((x$1) => userJars.$plus(x$1)) 

Sin embargo, si hago la expansión a mí mismo:

JarBuilder.findContainingJar(clazz).foreach {x => userJars = userJars + x } 

funciona bien.

¿Es esto un error de Scala? ¿O estoy haciendo algo terriblemente malo?

+1

'_' no significa lo que creo que significa que hay. Es un símbolo * especial * en ese contexto: * cualquier otro identificador simple debería funcionar bien *. Debido a esta magia, 'Some (4) .foreach (_ +: List())' "funciona bien". Para ver, compara 'Some (4) .map (_ + 1)' y 'Some (4) .map (x => x + 1)'. Esperemos que este sea un duplicado (y cerrado como tal) o habrá una buena respuesta que saque del SLS :) –

+1

http://stackoverflow.com/questions/7695270/underscore-in-list-filter (bueno), http : //stackoverflow.com/questions/4422016/scala-underscore-minimal-function, http://stackoverflow.com/questions/6593277/concise-notation-for-single-arg-anonymous-function-avoiding-underscore-not -wor –

+0

(En realidad, me pregunto si hay un contexto * any * donde '_' es * no * mágico * de otra manera * ...) –

Respuesta

6

El uso de la sintaxis de marcador de posición para funciones anónimas está restringido a las expresiones. En su código, está intentando usar el comodín en una declaración de asignación que no es lo mismo que una expresión.

Si observa detenidamente el error, puede ver que la expresión en el lado derecho de su tarea es lo que se está expandiendo a una función anónima.

Dado lo que está tratando de lograr, sin embargo es posible que desee considerar lo siguiente

userJars = userJars ++ JarBuilder.findContainingJar(clazz) 
+0

Gracias, tiene sentido. Aunque su solución ++ no funciona, ya que "findContainJar" está devolviendo una opción [T] no una lista [T] – Heptic

+0

Una opción debe convertirse implícitamente en una Iterable cuando sea necesario. Esto parece funcionar en 2.9.0.1 –

Cuestiones relacionadas