Ich würde mit der Unterscheidung beginnen, die in Scala zwischen def , val und var besteht .
def - definiert eine unveränderliche Bezeichnung für den Inhalt der rechten Seite, die träge ausgewertet wird - nach Namen auswerten.
val - definiert ein unveränderliches Label für den Inhalt der rechten Seite, das eifrig / sofort bewertet wird - bewertet nach Wert.
var - definiert eine veränderbare Variable , die anfänglich auf den ausgewerteten Inhalt der rechten Seite gesetzt wird.
Beispiel def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Beispiel, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Beispiel var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Gemäß den obigen Angaben können Beschriftungen von def und val nicht neu zugewiesen werden, und im Falle eines Versuchs wird ein Fehler wie der folgende ausgelöst:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Wenn die Klasse wie folgt definiert ist:
scala> class Person(val name: String, var age: Int)
defined class Person
und dann instanziiert mit:
scala> def personA = new Person("Tim", 25)
personA: Person
Für diese bestimmte Instanz von Person (dh 'personA') wird eine unveränderliche Bezeichnung erstellt. Immer wenn das veränderbare Feld "Alter" geändert werden muss, schlägt ein solcher Versuch fehl:
scala> personA.age = 44
personA.age: Int = 25
Wie erwartet ist 'Alter' Teil eines nicht veränderlichen Labels. Die richtige Vorgehensweise besteht darin, eine veränderbare Variable zu verwenden, wie im folgenden Beispiel:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
wie aus der Referenz der veränderlichen Variablen hervorgeht (dh 'personB') geht hervor, dass das klassenveränderliche Feld 'age' geändert werden kann.
Ich möchte immer noch betonen, dass alles von dem oben genannten Unterschied herrührt, der für jeden Scala-Programmierer klar sein muss.
val
geändert werden, das Objekt, auf das sich ein Wert bezieht, jedoch nicht. Aval
ist keine Konstante.