我试图理解以下代码,情况如何在以下代码中更新case类哑元的变量a
中的值。
在value
方法中,我将a
的值分配给b
,并向b
添加新的Node,这反过来反映了它的变化。也a
。我不知道如何更改a
的值,而无需重新分配。
object test {
def main(args: Array[String]) {
case class abc(str: String, var ele: abc)
case class dummy(a: abc) {
def value() = {
var b = a
println(s"Value of B before changing : ${b.str}") // Value of B before changing : Good
println(s"Value of A before changing : ${a.str}") // Value of A before changing : Good
val newObj = abc(" Morning", null)
b.ele = newObj
println(s"Value of A After changing : ${a.str},${a.ele.str}") // Value of A After changing : Good, Morning
println(s"Value of B after changing : ${b.str},${b.ele.str}") // Value of B after changing : Good, Morning
}
}
val testObj = dummy(abc("Good", null))
testObj.value()
}
}
答案 0 :(得分:2)
var b = a
这不会复制。
现在,两个变量都指向同一个对象,对b
状态所做的任何更改也将反映在a
中。
由于这个(和其他原因),我们强烈建议您避免发生可变状态。如果您的案例类中没有var
,它将是不可变的,并且您可以确定,无论您将a
交给谁,当您将其退还时,它仍然是完整的。
(第二个不好的习惯是使用null
。在Scala中不需要这样做,而是将类型设为Option
)。