Boy, quello è sottile, ma per quanto posso dire è seguendo completamente lo Scala spec. Citerò dalla versione 2.9 della specifica.
Per il vostro primo esempio: come dici giustamente, si sta vedendo l'espansione eta attraverso un caso particolare di un valore Method (§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.
L'algoritmo per l'espansione eta è dato nel § 6.26.5 che è possibile seguire per dare la seguente sostituzione per l'espressione new Foo().x1 _
:
{
val x1 = new Foo();
(y1: Int) => x1.(y1);
}
Ciò implica che, quando è in uso l'espansione eta, tutti i sotto-espressioni sono valutate nel punto in cui la c onversion ha luogo (se ho capito correttamente il significato della frase "massima espressione secondaria") e l'espressione finale è la creazione di una funzione anonima.
Nel vostro secondo esempio, quelle parentesi in più significa che il compilatore esaminerà §6.23 (in particolare, "Segnaposto Sintassi per funzioni anonime) e creare direttamente una funzione anonima.
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.
In tal caso , e in seguito l'algoritmo in tale sezione, l'espressione finisce per essere questa:
(x1: Int) => new Foo().foo(x1)
la differenza è sottile e, come spiegato molto bene da @Antoras, mostra solo effettivamente in presenza del codice di effetto collaterale.
Si noti che è in esecuzione un bugfix per il caso che coinvolge blocchi di codice call-by-name (vedere, ad esempio, this question, this bug e this bug).
Postscript: In entrambi i casi, la funzione anonima (x1:Int) => toto
viene ampliato per
new scala.Function1[Int, Int] {
def apply(x1: Int): Int = toto
}
Questa domanda ha avuto una risposta, ma non riesco a vedere più. Qualcuno lo ha cancellato? –