var immutable
contre. val mutable
En plus de nombreuses excellentes réponses à cette question. Voici un exemple simple, qui illustre les dangers potentiels de val mutable
:
Les objets mutables peuvent être modifiés à l'intérieur de méthodes, qui les prennent comme paramètres, tandis que la réaffectation n'est pas autorisée.
import scala.collection.mutable.ArrayBuffer
object MyObject {
def main(args: Array[String]) {
val a = ArrayBuffer(1,2,3,4)
silly(a)
println(a) // a has been modified here
}
def silly(a: ArrayBuffer[Int]): Unit = {
a += 10
println(s"length: ${a.length}")
}
}
Résultat:
length: 5
ArrayBuffer(1, 2, 3, 4, 10)
Une telle chose ne peut pas se produire avec var immutable
, car la réaffectation n'est pas autorisée:
object MyObject {
def main(args: Array[String]) {
var v = Vector(1,2,3,4)
silly(v)
println(v)
}
def silly(v: Vector[Int]): Unit = {
v = v :+ 10 // This line is not valid
println(s"length of v: ${v.length}")
}
}
Résulte en:
error: reassignment to val
Étant donné que les paramètres de fonction sont traités, val
cette réaffectation n'est pas autorisée.