Class 用val声明类的实例
在Scala中,Class 用val声明类的实例,class,scala,immutability,Class,Scala,Immutability,在Scala中,val关键字声明一个不可变变量。因此,如果您声明valx=3,它将保持为3。但是如果您使用var,它可能会改变 但是,如果使用val声明类的实例,会发生什么?例如,以此类点 class Point(_x: Int, _y: Int) { var x = _x var y = _y def doubleValues = { x *= 2 y *= 2 } } 首先,我
val
关键字声明一个不可变变量。因此,如果您声明valx=3
,它将保持为3。但是如果您使用var
,它可能会改变
但是,如果使用val
声明类的实例,会发生什么?例如,以此类点
class Point(_x: Int, _y: Int) {
var x = _x
var y = _y
def doubleValues = {
x *= 2
y *= 2
}
}
首先,我声明var location=新点(2,2)
然后跑
正如预期的那样,输出是
2
2
4
4
但是如果我重新运行并使用val
关键字来声明位置,结果是相同的。因此,即使location
被声明为不可变的,其中的可变变量仍然是可变的
那么,当您使用val
声明一个类的实例时,实际会发生什么呢?使用var
和val
之间到底有什么区别?指向对象的指针是不可变的,而不是对象本身。使用var
可以更改它是哪个点;使用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
)或使用类似于状态的monad。拥有一个成员可变的“不可变”对象的价值相对较小
class Q(i: Int) {val x: Int = i}
var q = new Q(4)
q = new Q(6)
q.x = 2 // won't compile