Comenzaría por la distinción que existe en Scala entre def , val y var .
def : define una etiqueta inmutable para el contenido del lado derecho que se evalúa perezosamente : evalúe por nombre.
val - define una etiqueta inmutable para el contenido del lado derecho que se evalúa con entusiasmo / de inmediato - evaluado por valor.
var : define una variable mutable , inicialmente establecida en el contenido evaluado del lado derecho.
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 lo anterior, las etiquetas de def y val no se pueden reasignar, y en caso de cualquier intento, se generará un error como el siguiente:
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
se crea una etiqueta inmutable para esa instancia específica de Persona (es decir, 'personaA'). Cada vez que el campo mutable 'edad' necesita ser modificado, tal intento falla:
scala> personA.age = 44
personA.age: Int = 25
como se esperaba, 'age' es parte de una etiqueta no mutable. La forma correcta de trabajar en esto consiste en usar una variable mutable, como en el siguiente ejemplo:
scala> var personB = new Person("Matt", 36)
personB: Person = Person@59cd11fe
scala> personB.age = 44
personB.age: Int = 44 // value re-assigned, as expected
como claro, a partir de la referencia de variable mutable (es decir, 'persona B') es posible modificar el campo mutable de clase 'edad'.
Todavía enfatizaría el hecho de que todo proviene de la diferencia mencionada anteriormente, eso tiene que estar claro para cualquier programador de Scala.
val
se puede cambiar pero el objeto al que se refiere un val no. Aval
no es una constante.