考虑一个简单的类和一个(不可变的)值实例:
class MyClass (var m: Int) {}
val x : MyClass = new MyClass(3)
Run Code Online (Sandbox Code Playgroud)
由于m被声明为变量(var),因此m为mutable。但是,由于x被声明为值,因此它是不可变的。那么是x.m可变的还是不变的?
如标题中所述,我无法Arraybuffer(Arraybuffer(Int,Int),Int)在for中重新分配类型的变量loop:
var ab1 = ArrayBuffer(le4: _*)
var ab2 = ab1 map (ligne => (ArrayBuffer(ligne._1: _*), ligne._2))
println("ab:" + ab2)
for {
i <- 1 to ab2.length
j <- 0 to i
} {
ab2(i)._1(j)._2 = j match {
case 0 => ab2(i - 1)._1(0)._2 + ab2(i)._1(j)._1
case i => ab2(i - 1)._1(j - 1)._2 + ab2(i)._1(j)._1
case _ => ab2(i - 1)._1(j)._2 + ab2(i - 1)._1(j - 1)._1 + ab2(i)._1(j)._1
}
}
Run Code Online (Sandbox Code Playgroud)
关键点是ab2声明为var但是其中的Int的更改被拒绝.为什么?
以下是声明不可变Map的Scala代码
var m:Map[Int,String] = Map(1->"hi",2->"hello")
println(m)
// Result: Map(1->"hi",2->"hello")
Run Code Online (Sandbox Code Playgroud)
在这里,我们能够添加或更改Map的内容,那么我们如何说scala中的map或list是不可变的
m=m+(3->"hey")
println(m)
// Result: Map(1->"hi",2->"hello",3->"hey")**
Run Code Online (Sandbox Code Playgroud) 在REPL中我们输入以下命令
scala> val p = 1 << 1
p: Int = 2
Run Code Online (Sandbox Code Playgroud)
再次
scala> val p = 1 << 2
p: Int = 4
Run Code Online (Sandbox Code Playgroud)
我的问题是,我读到val是不可变的.但在这种情况下,价值正在改变.那么有人可以告诉我为什么.这真的是变异的一个例子.请帮忙