scala - 隐式宏和黑盒宏

标签 scala macros

我有以下代码;

def $q[U](选择器:T => U,值:U)(隐式编写器:BSONDocumentWriter[U]): BSONDocument = 宏 MacrosImpl.getBsonExpr[T, U]

getBsonExpr的代码是;

def getBsonExpr[T, U](c: Context)(selector: c.Expr[T => Any], value: c.Expr[U])(implicit writer: BSONDocumentWriter[U]): c.Expr[BSONDocument] = {
    import c.universe._
    val helper = new Helper[c.type, T](c, selector)

    reify {
      val p = helper.pathStringExpr().splice
      val v = value.splice
      BSONDocument(p -> writer.write(v))
    }
  }

但是你不能将隐式传递给宏,所以当我编译时我得到:

宏实现不能具有除 WeakTypeTag 证据之外的隐式参数

有办法解决这个问题吗?

最佳答案

你可以使用

def $q[U](selector: T => U, value: U)(implicit writer: BSONDocumentWriter[U]): BSONDocument = macro MacrosImpl.getBsonExpr[T, U]

def getBsonExpr[T, U](c: Context)
  (selector: c.Expr[T => Any], value: c.Expr[U])
  (writer: c.Expr[BSONDocumentWriter[U]]): c.Expr[BSONDocument] = {
  <...>
}

您当然不能将 BSONDocumentWriter 本身的实例(仅表达式树)传递给宏,因为它是一个宏,并且会在您的程序之前进行编译。

我真的不知道你的宏应该做什么,所以我无法帮助你实现。如果您向我提供更多详细信息,我可以为您提供帮助。

关于scala - 隐式宏和黑盒宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26610731/

相关文章:

scala - 用于 spark 批处理应用程序的 Shutdown Hook

scala - 如何在 Scala 中验证数字字符?

scala - 使用附加隐式参数实现特征方法

scala - 如何在 Scala 中使用 Stream.cons 编写非泄漏尾递归函数?

macros - 数学 : Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

c - 如何获得用宏存储整数值所需的最少字节?

scala - 如何访问案例类字段字段的字符串名称中的值

macros - Haxe宏: quote field properly

java - 如何使用宏在 PowerPoint 中显示文本文件的内容

c - 宏扩展的奇怪结果