Короче говоря, var
и val
отмечают способность и неспособность, соответственно, переназначить имя в данной области.
val
означает, что ссылка на объект в этой области не можетменять;хотя базовый объект может измениться.var
означает, что объект, на который ссылается эта область, может измениться, поэтому его можно переназначить.
По сути, если объект, покидающий область действия функции, является изменяемым, он может быть изменен независимо от var
или val
.
См. Следующий пример:
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> def foo(): ArrayBuffer[Int] = {
| val buff = new ArrayBuffer[Int]()
| buff
| }
foo: ()scala.collection.mutable.ArrayBuffer[Int]
scala> def bar(): ArrayBuffer[Int] = {
| var buff = new ArrayBuffer[Int]()
| buff
| }
bar: ()scala.collection.mutable.ArrayBuffer[Int]
scala> val fooBuff = foo()
fooBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
scala> fooBuff.append(1)
scala> val barBuff = bar()
barBuff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()
scala> barBuff.append(1)
scala> println(fooBuff); println(barBuff)
ArrayBuffer(1)
ArrayBuffer(1)
Однако, если базовый объект не является изменяемым, он не будет изменяться вне области действия.
Для получения дополнительной информации см. этот пост .