我问了一个更长的问题,但似乎太多的代码让人们无法整理,所以我创建了这个问题,专注于我面临的一个更小的,具体的问题,关于在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
只是这段代码中case类的主构造函数的参数列表。我困惑的地方是准引用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
谁能解释一下这个错误?谢谢。
字段的类型是List[Symbol]
,这意味着这些字段的名称类型是不确定的(不知道是TermName
还是TypeName
)。这意味着你不能在准引号的任何地方插入这样的名字。
一个简单的修复方法是执行val name = field.name.toTermName
,显式地告诉编译器它正在查看一个术语名,以便准引用知道如何处理它。