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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:47:27