在Scala中,val
关键字声明了一个不可变的变量。因此,如果您声明val x = 3
,则它会保持为3.但如果您使用var
,则可以更改。{/ p>
但是如果用val
声明一个类的实例会怎样?例如,参加此课程Point
class Point(_x: Int, _y: Int) {
var x = _x
var y = _y
def doubleValues = {
x *= 2
y *= 2
}
}
首先,我宣布var location = new Point(2,2)
然后运行
println(location.x)
println(location.y)
location.doubleValues
println(location.x)
println(location.y)
正如预期的那样,输出是
2
2
4
4
但如果我重新运行并使用val
关键字来声明位置,结果是相同的。因此即使location
被声明为不可变,其中的可变变量仍然是可变的。
那么当你用val
声明一个类的实例时会发生什么?使用var
和val
之间有什么区别?
答案 0 :(得分:3)
使用var
,您可以更改Point
;使用val
,您无法
var x = new Point(2, 2)
x = new Point(3, 2)
val y = new Point(2, 2)
y = new Point(3, 2) // won't compile
相反,如果我创建一个包含val
的对象,我就无法更改该值"内部"对象,即使我可以改变对象本身:
class Q(i: Int) {val x: Int = i}
var q = new Q(4)
q = new Q(6)
q.x = 2 // won't compile
要使对象真正不可变,您需要使用val
"一直向下"。一个常见的模式是拥有你所有的"内部"对象不可变,然后有一些"顶级"可变的对象,可以是显式的(使用var
),也可以使用像State
monad这样的东西。拥有"不可变的"的价值相对较小。具有可变成员的对象。
答案 1 :(得分:0)
指向对象的指针是不可变的,而不是对象本身。