"too few argument lists for macro invocation"

"too few argument lists for macro invocation"

给定以下代码:

case class JetDim(dimension: Int) {
  require(dimension > 0)
}

object JetDim {
  def build(dimension: Int): Int = macro JetDimMacro.apply
}

及其调用的宏:

def apply(dimension: Int): Int = macro applyImpl

def applyImpl(c: Context)(dimension: c.Expr[Int]): c.Expr[Int] = ...

我遇到这个编译时错误:

[error]  too few argument lists for macro invocation
[error]  def build(dimension: Int): Int = macro JetDimMacro.apply

为什么?

macro 关键字采用的方法应该有一个 Context 参数作为其第一个参数列表(然后在后续列表中有许多 Expr 个参数)。在 JetDim 中,您给 macro 一个本身具有宏实现的方法。这只是无效的语法——您不能像这样 "nest" macro。您需要在 JetDim.build 中直接调用 JetDimMacro.apply(作为普通方法调用),或者使用 macro JetDimMacro.applyImpl(这更有可能是您想要的)。