在scala中的Val不是一成不变的

时间:2013-09-09 12:58:07

标签: scala

我正在玩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

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

由于

1 个答案:

答案 0 :(得分: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

编译器不允许这些。

另请注意,不变性不属于val s的属性。 scala中的val与java中的final非常相似 - 您只能一次分配值。然而,该对象仍然是可变的。例如:

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

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

不变性是班级的财产。对不可变对象的“更改”不会更改当前实例,它们会根据所做的更改创建新实例。 StringList[T]拥有此属性。上面的Foo类没有。