关于Scala变量可变性的问题

时间:2010-07-27 09:00:10

标签: scala immutability

我理解 val 关键字确定基础变量是不可变类型(以后不能重新分配)。现在我在scala编程中遇到了一个段落(第3章,scala中的后续步骤 - 使用类型参数化数组),它声明了

val greetStrings: Array[String] = new Array[String](3)
greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world!\n"
  

这三行代码说明了这一点   一个要理解的重要概念   关于斯卡拉的意义   VAL。使用时定义变量   val,变量无法重新分配,   但它引用的对象   可能仍有可能改变。所以   在这种情况下,你无法重新分配   greetStrings到不同的数组;   greetStrings总是指向   相同的Array [String]实例   它被初始化了。但你可以改变   该数组的元素[String]   随着时间的推移,所以数组本身就是   可变的。

因此它可以更改数组的元素。如果我们像这样定义

,它就无效
greetStrings = Array("a","b","c")

满足以下声明

  

使用时定义变量   val,变量无法重新分配,   但它引用的对象   可能仍有可能改变。

但如果我宣布这样的话

val str = "immutable string"

根据书中给出的定义

在上面的代码行中

它所指的对象可能仍然可能会被更改

1 个答案:

答案 0 :(得分:10)

声明 val 并不保证甚至暗示不可变类型。它只在Java中声明了一个 final 变量。无法重新分配标识符,但该值可能是可变类型。

在您的字符串值示例中,您既有 val 又有一个不可变类型String。所以这个标识符既不可重新分配也不可修改(不可变)。