Muchacho, eso es sutil, pero por lo que puedo decir está siguiendo completamente el Scala spec. Citaré de la versión 2.9 de la especificación.
Para su primer ejemplo: como usted dice con razón, que está viendo la expansión ETA a través de un caso especial de un Valor Método (§6.7):
The expression e _ is well-formed if e is of method type or if e is a call-by-name parameter. If e is a method with parameters, e _ represents e converted to a function type by eta expansion.
El algoritmo para la expansión eta se da en el § 6.26.5 que se puede seguir para dar la siguiente reemplazo para la expresión new Foo().x1 _
:
{
val x1 = new Foo();
(y1: Int) => x1.(y1);
}
Esto implica que cuando se está utilizando la expansión eta, todos los sub-expresiones se evalúan en el punto en el c se produce la conversión (si he entendido correctamente el significado de la frase "sub-expresión máxima") y la expresión final es la creación de una función anónima.
En el segundo ejemplo, los paréntesis adicionales significa que el compilador se verá en § 6.23 (específicamente, "Marcador de posición de sintaxis para funciones anónimas) y crear una función anónima directamente.
An expression (of syntactic category Expr) may contain embedded underscore symbols _ at places where identifiers are legal. Such an expression represents an anonymous function where subsequent occurrences of underscores denote successive parameters.
En ese caso , y siguiendo el algoritmo en esa sección, su expresión termina siendo este:
(x1: Int) => new Foo().foo(x1)
la diferencia es sutil y, como se explica muy bien por @Antoras, en realidad muestra sólo en presencia del código de efecto secundario.
Tenga en cuenta que hay una corrección de errores en curso para el caso de bloques de códigos de llamada por nombre (consulte, por ejemplo, this question, this bug y this bug).
PostScript: En ambos casos, la función anónima (x1:Int) => toto
se expandió a
new scala.Function1[Int, Int] {
def apply(x1: Int): Int = toto
}
Esta pregunta tenía una respuesta, pero no puedo verlo más. ¿Alguien lo eliminó? –