我正在玩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
我不确定我做了什么,我相信我应该收到错误?
由于
答案 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
不变性是班级的财产。对不可变对象的“更改”不会更改当前实例,它们会根据所做的更改创建新实例。 String
和List[T]
拥有此属性。上面的Foo
类没有。