具有循环引用和值更新的Scala案例类

时间:2019-03-09 04:10:57

标签: scala

我试图理解以下代码,情况如何在以下代码中更新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()
  }
}

1 个答案:

答案 0 :(得分:2)

var b = a

这不会复制。

现在,两个变量都指向同一个对象,对b状态所做的任何更改也将反映在a中。

由于这个(和其他原因),我们强烈建议您避免发生可变状态。如果您的案例类中没有var,它将是不可变的,并且您可以确定,无论您将a交给谁,当您将其退还时,它仍然是完整的。

(第二个不好的习惯是使用null。在Scala中不需要这样做,而是将类型设为Option)。