首页 文章

关于Scala变量可变性的问题

提问于
浏览
4

据我所知 val 关键字确定底层变量是一个Immutable类型(以后不能重新分配) . 现在我在scala编程中遇到了一个段落(第3章,scala中的后续步骤 - 使用类型参数化数组),它说明

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

这三行代码说明了一个重要的概念,以了解有关val的含义的Scala . 使用val定义变量时,无法重新分配变量,但可能仍会更改其引用的对象 . 所以在这种情况下,你无法将greetStrings重新分配给不同的数组; greetStrings将始终指向与其初始化的相同Array [String]实例 . 但是你可以随着时间的推移改变那个Array [String]的元素,所以数组本身是可变的 .

所以它有效地改变了数组的元素 . 如果我们这样定义,它就无效了

greetStrings = Array("a","b","c")

它满足以下声明

使用val定义变量时,无法重新分配变量,但可能仍会更改其引用的对象 .

但如果我宣布这样的话

val str = "immutable string"

根据书中给出的定义

在上面的代码行中它意味着 object to which it refers could potentially still be changed

1 回答

  • 10

    声明 val 并不保证甚至暗示不可变类型 . 它只声明你可以在Java中调用 final 变量 . 不能重新分配标识符,但该值可以是可变类型 .

    在您的字符串值示例中,您同时拥有 val 和不可变类型String . 因此,此标识符既不可重新分配也不可修改(不可变) .

相关问题