Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 用val声明类的实例_Class_Scala_Immutability - Fatal编程技术网

Class 用val声明类的实例

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 } } 首先,我

在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
       }
   }
首先,我声明
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