, die drei Ausdrucksweisen die gleiche Funktion f(a) := a + 1
Gegeben:Unterschiede zwischen diesen drei Möglichkeiten, eine Funktion in Scala
val f1 = (a:Int) => a + 1
def f2 = (a:Int) => a + 1
def f3:(Int => Int) = a => a + 1
Wie diese Definitionen unterscheiden? Die REPL keine offensichtlichen Unterschiede zeigen:
scala> f1
res38: (Int) => Int = <function1>
scala> f2
res39: (Int) => Int = <function1>
scala> f3
res40: (Int) => Int = <function1>
Sie sollten, dass im zweiten Block oben beachten Sie, dass die Bewertung 'f1' im REPL den Wert zeigt statisch' f1' gebunden, während die Bewertung 'f2 'und' f3' zeigen das Ergebnis von * Aufruf * dieser Methoden. Insbesondere wird jedes Mal, wenn entweder 'f2' oder' f3' aufgerufen wird, eine neue 'Function1 [Int, Int]' - Instanz erzeugt, während 'f1' für immer die gleiche' Funktion1 [Int, Int] 'ist. –
@RandallSchulz Angesichts der Tatsache, dass die val-Version keine neue Funktionsinstanz benötigt, warum sollte man in diesem Fall def verwenden? – virtualeyes
@virtualeyes Die einzige Situation, an die ich mich erinnern kann, wo man Defs sieht, die FunctionN-Werte [...] liefern, ist in der Kombinator-Parser-Bibliothek. Es ist nicht sehr üblich, Methoden zu schreiben, die Funktionen liefern, und praktisch niemals würde man ein def verwenden, um viele Kopien einer semantisch/funktional unveränderlichen Funktion zu erhalten. –