使用Scala Quicklens替换Enumeration字段触发scalac发射错误如何解决?
问题原因
该报错是Quicklens的宏展开逻辑处理scala.Enumeration类型成员引用的已知缺陷导致的:当modify路径的eachWhere谓词中直接引用枚举单例对象的成员时,宏生成的字节码会错误处理枚举对象的懒加载初始化路径,最终触发scalac的代码发射阶段异常,该问题在Scala 2.12/2.13版本搭配1.8.0版本以前的Quicklens时极易复现。
解决方案
- 优先升级Quicklens到1.8.0及以上版本,该版本官方已经修复了枚举值在谓词中的引用解析bug,无需修改业务代码即可解决问题。
- 若暂时无法升级依赖,可将谓词中引用的枚举值提前绑定到局部变量,修改后代码示例如下:
// 提前绑定枚举值到局部变量,避开宏的错误捕获 val target = value1 val replaceVal = value2 val b: Bar = bar.modify(_.address.name.eachWhere(_ == target)).setTo(replaceVal)
- 也可以直接用原生Scala的嵌套copy语法实现相同逻辑,完全避开Quicklens宏处理:
val b: Bar = bar.copy( address = bar.address.copy( name = bar.address.name.map(v => if (v == value1) value2 else v) ) )
内容的提问来源于stack exchange,提问作者gekomad
相关产品推荐
相关产品推荐

