Scala宏。在Quasiquetes中使用字符串

Scala宏。在Quasiquetes中使用字符串,scala,scala-macros,scala-quasiquotes,Scala,Scala Macros,Scala Quasiquotes,我试图通过case类参数生成语句 case class f(a:String, b:String){ val statement = Macroses.st[f] } object MacrosTest { def start() { val result = f("1", "2").statement } } 结果必须插入到tableName(a,b)值('1','2') 这是我的宏 def st[T]:Insert = macro st_impl[T] def

我试图通过case类参数生成语句

case class f(a:String, b:String){
  val statement = Macroses.st[f]
}

object MacrosTest {
  def start() {
    val result =  f("1", "2").statement
  }
}
结果必须插入到tableName(a,b)值('1','2')

这是我的宏

 def st[T]:Insert = macro st_impl[T]

 def st_impl[A : c.WeakTypeTag](c: Context): c.Expr[Insert] = {
   import c.universe._
   val methods: List[String] = c.weakTypeOf[A].typeSymbol.
   typeSignature.decls.toList.filterNot(_.isMethod)
   .map(_.name.toString)
   c.Expr[Insert](q"""QueryBuilder.insertInto("tableName")${methods.map(v => s""".value("$v", $v)""").mkString}""")
 }
我有一个例外:

 c.universe.Name expected but c.universe.Tree found
如果我用这个Quasikote,效果很好

(q"""QueryBuilder.insertInto("tableName").value("a", a).value("b", b)""")

在quasiqueotes中,$并不意味着像s“”那样插入字符串。它必须是一棵树。让我想一想。我这样做了:
q”““导入com.datastax.driver.core.querybuilder.querybuilder${methods.map(v=>(v.toColumnCase,TermName(v))}.foldLeft(querybuilder.insertInto(${reify(tableName.splice)})((newInsert,next)=>newInsert.value(next.\u 1,next.\u 2))”
但foldLeft在运行时工作,它不是我想要的。在quasiquotes中,$并不意味着像s“”那样插入字符串。它必须是一棵树。让我想一想。我这样做了:
q”““导入com.datastax.driver.core.querybuilder.querybuilder${methods.map(v=>(v.toColumnCase,TermName(v))}.foldLeft(querybuilder.insertInto(${reify(tableName.splice)})((newInsert,next)=>newInsert.value(next.\u 1,next.\u 2))”
但是foldLeft在运行时工作,它不是我想要的。