我问了更长的question,但似乎有太多的代码供人们排序,所以我创建了这个问题,专注于一个较小的,特定的问题我'面对在Scala中使用宏的问题。
请考虑以下代码段:
val tpe = weakTypeOf[T]
val companion = tpe.typeSymbol.companionSymbol
val fields = tpe.declarations.collectFirst {
case m: MethodSymbol if m.isPrimaryConstructor => m
}.get.paramss.head
val toMapParams = fields.map { field =>
val name = field.name
val decoded = name.decoded
q"$decoded -> t.$name"
}
请注意,fields
只是此代码中案例类的主要构造函数的参数列表。我困惑的地方是quasiquote q"$decoded -> t.$name"
的结果。这究竟是什么意思?它应该是什么类型的?我收到编译错误,说明以下内容:
Multiple markers at this line
- Implicit conversions found: q"$decoded -> t.$name" => Quasiquote(q"$decoded -> t.
$name")
- type mismatch; found : field.NameType required: c.universe.TermName
- type mismatch; found : field.NameType required: c.universe.TermName
任何人都可以解释这个错误吗?感谢。
答案 0 :(得分:2)
字段类型为List[Symbol]
,这意味着这些字段的名称类型尚无定论(未知是TermName
还是TypeName
)。这意味着您无法在quasiquote中的任何位置插入此类名称。
一个简单的解决方法是val name = field.name.toTermName
,明确地告诉编译器它正在查看术语名称,以便quasiquote知道如何处理它。