我有以下代码;
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/