【问题标题】:Scala not found: value macroScala 未找到:值宏
【发布时间】:2016-04-14 22:01:42
【问题描述】:

这一行:

"foo".assertNonFatal( _ equals "foo", "error message");

这个错误:

Error:(120, 47) not found: value assertion

这个钩子:

final implicit class ImplicitAssert[MyType](val me: MyType) {

  final def assertNonFatal(assertion: (MyType) => Boolean, message: String)
    : MyType = macro ImplicitAssertMacros.assertNonFatal[MyType]
}

这个宏:

object ImplicitAssertMacros {
  def assertNonFatal[MyType](c: scala.reflect.macros.blackbox.Context)
      (assertion: c.Tree, message: c.Tree): c.Tree = {
    import c.universe._
    val me = q"${c.prefix}.me" // "me" from ImplicitAssert class.
    val numLines = q"Int.MaxValue"
    val useStdOut = q"false"
    val assertionTrue = q"assertion($me)"
    val isFatal = q"false"
    val toReturn = q"""
       _root_.info.collaboration_station.debug.internal.Printer.traceInternalAssert($message, $numLines, $useStdOut, $assertionTrue, $isFatal);
       $me;
    """
    toReturn
  }
}

^ 我无法弄清楚这个编译器错误的原因是什么或如何修复它。

请注意,这只发生在我编译源文件时,而不是宏。

【问题讨论】:

  • 您是否在编译调用宏的代码之前在编译会话中编译宏?
  • @pedrofurla - 在 sbt 中的宏上运行“编译”以 [成功] 结束。运行 "test:compile" for "foo".assertNonFatal(_equals "foo", "error message") 以 "not found: value assertion" 结束

标签: scala compiler-errors macros


【解决方案1】:

它通过改变来工作:

val assertionTrue = q"$assertion($me)"

一个 def 宏在调用点展开,这里不再有任何断言参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多