2014-11-02 171 views
1

在Scala中,val关键字声明了一个不可变的变量。所以如果你声明val x = 3,它保持为3.但是如果你使用var,它可以改变。用val声明一个类的实例

但是如果你用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声明一个类的实例时会发生什么呢?使用varval的区别究竟是什么?

回答

3

With a var you can change which which Point it is;用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的东西。拥有可变成员的“不可变”对象的价值相对较小。

0

指向对象的指针是不可变的,而不是对象本身。