Scala操作ListBuffer时报Reassignment to val错误求助
报错原因分析
- 报错的核心触发逻辑是Scala中
val修饰的变量/成员属性不允许被重新赋值。即使leftData.dimList指向的是可变的mutable.ListBuffer实例,只要dimList本身是用val声明的,你就不能让dimList这个属性绑定到新的ListBuffer实例。 - 你代码中调用的
patch方法会返回一个全新的ListBuffer实例,你尝试把这个新实例赋值给val修饰的leftData.dimList,直接触发了Reassignment to val规则。
解决方案
根据你的业务场景可以选择以下任意一种方案:
- 方案一:修改
dimList的声明规则
如果业务逻辑确实需要让dimList可以更换指向的ListBuffer实例,直接把leftData对应类中dimList的修饰符从val改为var即可:
// 原成员声明示例 class LeftData { val dimList: ListBuffer[DimType] = ListBuffer.empty } // 修改后 class LeftData { var dimList: ListBuffer[DimType] = ListBuffer.empty }
修改后你原有的赋值代码可以正常运行。
- 方案二:直接修改原
ListBuffer内部元素(更推荐)mutable.ListBuffer本身支持原地修改,你不需要通过patch生成新实例再赋值,直接调用insertAll方法就能实现和你当前代码一样的插入逻辑,不需要修改dimList的val声明:
// 替换原有的赋值代码 leftData.dimList.insertAll(index, Seq(rightData.dimList(index)))
该方案不需要修改类结构,也不会生成额外的集合实例,性能更优,是可变集合的标准使用方式。
- 方案三:返回新的
leftData实例
如果你的业务要求dimList必须为val且不能修改原实例的内部状态,那么可以基于原leftData生成一个新的实例,替换对应的dimList属性即可:
val newLeftData = leftData.copy( dimList = newDimVal.patch(index, Seq(rightData.dimList(index)), 0) )
后续你直接使用新生成的newLeftData做逻辑处理即可。
内容的提问来源于stack exchange,提问作者Yogesh
相关产品推荐
相关产品推荐

