Im Gegensatz zu val
oder var
Erklärung, def i = 3
ist nicht Variablendeklaration. Sie definieren eine Methode/Funktion, die eine Konstante 3
zurückgibt und i
keine Parameter annimmt.
Deklaration mit val
und var
werden sofort ausgewertet, aber im Falle von Lazy Val und Def-Bewertung passiert, wenn explizit aufgerufen.
i
ist eine Nicht-Argument-Funktion. Um Verwirrung loszuwerden Sie es mit leeren Klammern erklären könnte auch
def i() = 3
Unterschied zwischen lazy val
und def
ist
faul val träge ausgewertet und das Ergebnis zwischengespeichert wird. Das bedeutet, dass
Def Deklaration jedes Mal ausgewertet wird, wenn Sie Methodenname aufrufen.
Beispiel Scala REPL mit
scala> lazy val a = { println("a evaluated"); 1}
a: Int = <lazy>
scala> def i = { println("i function evaluated"); 2}
i: Int
scala> a
a evaluated
res0: Int = 1
scala> a
res1: Int = 1
scala> a
res2: Int = 1
scala> i
i function evaluated
res3: Int = 2
scala> i
i function evaluated
res4: Int = 2
scala> i
i function evaluated
res5: Int = 2
Beachten Sie, dass a
nur einmal ausgewertet wird und weitere Anrufungen von a
Rückkehr der zwischengespeicherte Ergebnis also faul val wird einmal ausgewertet, wenn es aufgerufen wird und das Ergebnis gespeichert wird für immer. So sehen Sie println Ausgabe einmal
Hinweis Funktion wird jedes Mal ausgewertet, wenn es aufgerufen wird. In diesem Fall sehen Sie println Ausgang jedes Mal, wenn Sie die Funktion
Es gibt eine Konvention der Verwendung eines leeren Parameterliste, wenn die Methode hat Nebenwirkungen und verlassen sie
Allgemeine Übereinkommen berufen ab, wenn seine rein.
bearbeitet scala> def i = 1
i: Int
scala> :type i
Int
scala> :type i _
() => Int
Danke für die detaillierte Erklärung. Aber wenn 'def 'eine Funktion deklariert oder eher ein Funktionsobjekt erzeugt, warum gibt' getClass' dann den Typ 'Int' zurück? Ich würde erwarten, eine Art von Funktionsobjekt zu sehen. Zum Beispiel: lambdas in Java8 implementieren eine der Schnittstellen im 'java.util.function. *' Paket. –
@KshitizSharma Scala hat das Prinzip des einheitlichen Zugriffs, so dass Clients nicht wissen müssen, ob sie auf ein Feld zugreifen oder eine Methode ohne Nebenwirkungen aufrufen. –
Richtig, wenn Sie über den resultierenden Wert besorgt sind. Aber bei der Analyse einer Funktion durch Reflexion sollte sie ihre Funktion nicht als Int bezeichnen. –