Yo empezaría por la distinción que existe en Scala entre def, val y var.
def - define un etiqueta inmutable por el contenido banda derecha que se perezosamente evaluaron - evaluar por su nombre.
val - define un etiqueta inmutable por el contenido banda derecha que es ansiosamente/inmediatamente evaluado - evaluado por valor.
var - define una variable mutable , inicialmente establecido en el contenido lado derecho evaluado.
ejemplo, def
scala> def something = 2 + 3 * 4
something: Int
scala> something // now it's evaluated, lazily upon usage
res30: Int = 14
ejemplo, val
scala> val somethingelse = 2 + 3 * 5 // it's evaluated, eagerly upon definition
somethingelse: Int = 17
ejemplo, var
scala> var aVariable = 2 * 3
aVariable: Int = 6
scala> aVariable = 5
aVariable: Int = 5
Según anteriormente, las etiquetas de def y val no pueden ser reasignados, y en caso de cualquier intento de un error como se planteó la debajo de uno:
scala> something = 5 * 6
<console>:8: error: value something_= is not a member of object $iw
something = 5 * 6
^
Cuando la clase se define como:
scala> class Person(val name: String, var age: Int)
defined class Person
y luego instanciado con:
scala> def personA = new Person("Tim", 25)
personA: Person
etiqueta inmutable se crea para esa instancia específica de Persona (es decir, 'persona'). Siempre que la 'edad' del campo mutable necesita ser modificada, tal intento falla:
scala> personA.age = 44
personA.age: Int = 25
como se esperaba, 'edad' es parte de una etiqueta no mutable.La forma correcta para trabajar en este consiste en el uso de una variable mutable, como en el siguiente ejemplo:
scala> var personB = new Person("Matt", 36)
personB: Person = [email protected]
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
tan claro, a partir de la mutable de referencia variable (es decir, 'PersonB') es posible modificar la clase campo mutable 'edad'.
Todavía destacaría el hecho de que todo proviene de la diferencia antes mencionada, que debe tenerse en cuenta en cualquier programador de Scala.
Esta respuesta es la explicación más clara. – stackoverflowuser2010