Scala 3.2.2中延迟内联方法调用失败问题求助
Scala 3 inline given 调用报错的原因与修复
问题原因
你遇到的编译错误,本质是inline方法的展开规则限制:
当你在一个inline方法里调用另一个inline方法时,如果这个被调用的inline方法来自一个using参数(比如代码里的mA、mB),编译器需要确保这个参数对应的given实例是可被inline展开的具体实现。但原代码里的mA、mB是普通的using参数,编译器无法在展开maxForPairs.max时,确定它们的max方法的具体实现,所以会报错“延迟inline方法无法被调用”。
修复方案
把maxForPairs的using参数标记为inline using,让编译器明确这些参数对应的given实例是inline的,能在展开时获取到具体实现。
修改后的完整代码:
trait Max[X]: inline def max(a: X, b: X): X inline given maxForDoubles: Max[Double] with inline def max(a: Double, b: Double) = if a < b then b else a // 关键改动:把using改成inline using inline given maxForPairs[A, B](inline using mA: Max[A], mB: Max[B]): Max[(A, B)] with inline def max(x: (A, B), y: (A, B)) = (mA.max(x._1, y._1), mB.max(x._2, y._2)) @main def entryPoint(): Unit = { println(summon[Max[(Double, Double)]].max((10.0, 3.0), (20.0, -7.0))) }
验证结果
运行修改后的代码,会输出预期的(20.0,3.0)。
额外优化(可选)
可以封装一个顶层inline方法,让调用更简洁:
inline def max[A](a: A, b: A)(inline using m: Max[A]): A = m.max(a, b) // 调用时直接写: println(max((10.0, 3.0), (20.0, -7.0)))
内容的提问来源于stack exchange,提问作者Andrey Tyukin
相关产品推荐
相关产品推荐

