Comincerei dalla distinzione che esiste in Scala tra def , val e var .
def - definisce un'etichetta immutabile per il contenuto del lato destro che viene valutato pigramente - valuta per nome.
val - definisce un'etichetta immutabile per il contenuto del lato destro che viene valutata con entusiasmo / immediato - valutata in base al valore.
var : definisce una variabile mutabile , inizialmente impostata sul contenuto del lato destro valutato.
Esempio, def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
Esempio, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
Esempio, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
In base a quanto sopra, le etichette di def e val non possono essere riassegnate e in caso di tentativi verrà generato un errore come quello sotto:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Quando la classe è definita come:
scala> class Person(val name: String, var age: Int)
defined class Person
e quindi istanziato con:
scala> def personA = new Person("Tim", 25)
personA: Person
un'etichetta immutabile viene creata per quella specifica istanza di una persona (cioè 'Persona'). Ogni volta che il campo mutabile 'age' deve essere modificato, tale tentativo fallisce:
scala> personA.age = 44
personA.age: Int = 25
come previsto, "age" fa parte di un'etichetta non modificabile. Il modo corretto di lavorare su questo consiste nell'utilizzare una variabile mutabile, come nel seguente esempio:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
come chiaro, dal riferimento alla variabile mutabile (cioè "personaB") è possibile modificare il campo mutabile della classe "età".
Vorrei ancora sottolineare il fatto che tutto deriva dalla differenza sopra indicata, che deve essere chiara in mente a qualsiasi programmatore di Scala.
val
può essere modificato ma l'oggetto a cui fa riferimento una val non può essere modificato. Aval
non è una costante.