0

我只是在玩 scala 并做了一些非常基本的 Val 分配,见下文,如果我重新分配 val,它似乎就像一个 var 一样。

scala> val number = 17
number: Int = 17

scala> println(number)
17

scala> val number = 20
number: Int = 20

scala> number
res1: Int = 20

scala> val string = "ABC1234"
string: String = ABC1234

scala> println(string)
ABC1234

scala> val string = "DEF123"
string: String = DEF123

scala> println(string)
DEF123

我不确定我做了什么,我相信我应该得到一个错误?

谢谢

4

1 回答 1

3

这仅在 REPL 中发生,并且仅当您val再次输入关键字时才会发生。这是一个方便的功能,因此您可以在 REPL 中玩游戏并继续重复使用相同的名称。否则,您必须重新启动它,这会很烦人。

scala> val foo = "abc"
foo: String = abc

scala> foo = "def"
<console>:8: error: reassignment to val
       foo = "def"
       ^

然而,

scala> val bar = 123
bar: Int = 123

scala> val bar = 456
bar: Int = 456

编译器都不允许这些。

另请注意,不变性不是vals 的属性。 valscala 中的函数很像finaljava 中的函数——你只能分配一次值。然而,该对象仍然可能是可变的。例如:

scala> val foo = new Foo("abc", "def")
foo: Foo = Foo@6e905272

scala> foo.foo = "ghi"
foo.foo: String = ghi

不变性是类的属性。对不可变对象的“更改”不会更改当前实例,它们会使用所做的更改创建一个新实例。 StringList[T]拥有这个属性。上面的Foo类没有。

于 2013-09-09T13:05:36.427 回答