得到电话课

时间:2013-01-09 21:27:31

标签: scala scala-2.10 scala-macros

我想得到一个宏的调用类,但我的代码不起作用:

def __CLASS__(c: Context) = {
    import c.universe._
    c.enclosingClass match {
    case ClassDef(mods, name, tparams, impl) =>
    c.universe.reify(println(
            "\n  mods "+c.literal(mods.toString).splice
            +"\n  name "+c.literal(name.toString).splice
            +"\n  tparams "+c.literal(tparams.toString).splice
            +"\n  impl "+c.literal(impl.toString).splice
            ))
    case _ => c.abort(c.enclosingPosition, "NoEnclosingClass")
    }
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

当从类的普通实例中调用时,这将按原样工作,因此我假设您是在对象内部尝试它,在这种情况下,您需要匹配ModuleDef以及ClassDef

case ModuleDef(mods, name, impl) => c.universe.reify(
  printf(
    "\n  mods %s\n  name %s\n  impl %s\n",
    c.literal(mods.toString).splice,
    c.literal(name.toString).splice,
    c.literal(impl.toString).splice
  )
)

请注意,调试此类内容的一种简单方法是打印出您所获得的任何意外事件的原始表示:

case x => c.abort(c.enclosingPosition, "NoEnclosingClass: " + showRaw(x))

在单例对象中调用时会打印以下内容:

<console>:7: error: NoEnclosingClass: ModuleDef(Modifiers(), ...

这让我们非常了解我们需要从哪里开始。