You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala循环引用样例类值更新疑问:未重赋值为何a的属性被修改?

为什么dummy样例类的a变量会被间接更新?

这是个非常典型的引用类型赋值问题,咱们一步步拆解清楚:

核心原因:Scala中对象是引用传递,不是值传递

当你在value()方法里写var b = a时,你并没有复制a指向的abc对象——而是让变量b和a指向内存中同一个abc实例。这就像你给同一扇门配了两把钥匙,不管用哪把钥匙开门/锁门,门的状态都会同步变化。

结合你的代码具体分析

  1. 初始化阶段:val testObj = dummy(abc("Good", null)),此时dummy的a字段指向一个abc实例,这个实例的str是"Good",ele是null。
  2. 赋值var b = a:b和a现在指向同一个abc对象,两者是同一个对象的"别名"。
  3. 修改b.ele = newObj:你不是改变b的指向,而是修改b所指向的那个abc对象的可变字段ele。因为a和b指向同一个对象,所以a.ele自然会同步更新为新的abc实例。

关键区分:修改引用 vs 修改对象字段

如果是给b重新赋值(比如b = newObj),那a不会有任何变化——因为这时候是让b指向另一个全新的对象,而a仍然指向原来的abc实例。但你这里操作的是对象内部的可变字段,不是引用本身,所以会影响到所有指向该对象的变量。

额外建议:避免意外可变的小技巧

如果不想让abc的字段被意外修改,可以把ele改成不可变的val:

case class abc(str: String, ele: abc) // 去掉var,ele变成不可变字段

这样你就无法修改b.ele,自然也就不会出现a被间接更新的情况了。

内容的提问来源于stack exchange,提问作者Guda uma shanker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:18:40