宏定义的 scala 准引用中的类型不匹配:"type mismatch; found : field.NameType required: c.universe.TermName"



我问了一个更长的问题,但似乎太多的代码让人们无法整理,所以我创建了这个问题,专注于我面临的一个更小的,具体的问题,关于在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,显式地告诉编译器它正在查看一个术语名,以便准引用知道如何处理它。

相关内容

  • 没有找到相关文章

最新更新