Je commencerai par la distinction qui existe entre dans Scala def, val et var.
def - définit une étiquette immuable pour le contenu latéral droit qui est évalué paresseusement - évaluer par nom.
val - définit une étiquette immuable pour le contenu de côté droit qui est vivement /immédiatement évalué - évalué par valeur.
var - définit une variables mutables, initialement fixé au 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és, et en cas de toute tentative une erreur comme ci-dessous un ressusciteront:
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ée:
scala> def personA = new Person("Tim", 25)
personA: Person
une étiquette immuable est créé pour cette instance spécifique de la personne (à savoir 'personnage'). Chaque fois que le champ mutable « âge » doit être modifié, cette tentative échoue:
scala> personA.age = 44
personA.age: Int = 25
comme prévu, « âge » fait partie d'une étiquette non-mutables.La bonne façon de travailler sur ce consiste à utiliser une variable mutable, comme dans l'exemple suivant:
scala> var personB = new Person("Matt", 36)
personB: Person = [email protected]
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
aussi claire, de la variables mutables référence (ie « personB ») il est possible de modifier la classe champ mutable 'age'.
Je voudrais encore souligner le fait que tout vient de la différence mentionnée ci-dessus, qui doit être clair à l'esprit de tout programmeur Scala.
Cette réponse est l'explication la plus claire. – stackoverflowuser2010