Je commencerais par la distinction qui existe dans Scala entre def , val et var .
def - définit une étiquette immuable pour le contenu du côté droit qui est évalué paresseusement - évalué par nom.
val - définit une étiquette immuable pour le contenu de droite qui est évalué avec empressement / immédiatement - évalué par valeur.
var - définit une variable mutable , initialement définie sur le contenu du côté droit évalué.
Exemple, def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Exemple, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Exemple, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Selon ci-dessus, les étiquettes de def et val ne peuvent pas être réaffectées, et en cas de tentative, une erreur comme celle ci-dessous sera déclenchée:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Lorsque la classe est définie comme:
scala> class Person(val name: String, var age: Int)
defined class Person
puis instancié avec:
scala> def personA = new Person("Tim", 25)
personA: Person
une étiquette immuable est créée pour cette instance spécifique de Person (c'est-à-dire «personA»). Chaque fois que le champ mutable 'age' doit être modifié, une telle tentative échoue:
scala> personA.age = 44
personA.age: Int = 25
comme prévu, «l'âge» fait partie d'une étiquette non mutable. La bonne façon de travailler consiste à utiliser une variable mutable, comme dans l'exemple suivant:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
comme clair, à partir de la référence de variable mutable (c'est-à-dire 'personB'), il est possible de modifier le champ de classe mutable 'age'.
J'insisterais encore sur le fait que tout vient de la différence mentionnée ci-dessus, qui doit être claire à l'esprit de tout programmeur Scala.
val
peut être changé mais l'objet auquel se réfère un val ne le peut pas. Aval
n'est pas une constante.