var immutable
เทียบกับ val mutable
นอกเหนือจากคำตอบที่ยอดเยี่ยมมากมายสำหรับคำถามนี้ นี่คือตัวอย่างง่ายๆที่แสดงให้เห็นถึงอันตรายที่อาจเกิดขึ้นจากval mutable
:
ออบเจ็กต์ที่เปลี่ยนแปลงได้สามารถแก้ไขได้ภายในเมธอดซึ่งใช้เป็นพารามิเตอร์ในขณะที่ไม่อนุญาตให้กำหนดใหม่
import scala.collection.mutable.ArrayBuffer
object MyObject {
def main(args: Array[String]) {
val a = ArrayBuffer(1,2,3,4)
silly(a)
println(a)
}
def silly(a: ArrayBuffer[Int]): Unit = {
a += 10
println(s"length: ${a.length}")
}
}
ผลลัพธ์:
length: 5
ArrayBuffer(1, 2, 3, 4, 10)
สิ่งนี้ไม่สามารถเกิดขึ้นได้var immutable
เนื่องจากไม่อนุญาตให้มอบหมายใหม่:
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
println(s"length of v: ${v.length}")
}
}
ผลลัพธ์ใน:
error: reassignment to val
เนื่องจากพารามิเตอร์ฟังก์ชันได้รับการปฏิบัติเนื่องจากval
ไม่อนุญาตให้มีการกำหนดใหม่