1

我问了一个更长的问题,但似乎代码太多,人们无法整理,所以我创建了这个问题,专注于我在 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

谁能解释这个错误?谢谢。

4

1 回答 1

2

字段的类型是List[Symbol],这意味着这些字段的名称类型是不确定的(不知道是 aTermName还是TypeName)。这意味着您基本上不能在准引号中的任何位置插入此类名称。

一个简单的解决方法是val name = field.name.toTermName明确地告诉编译器它正在查看一个术语名称,以便 quasiquote 知道如何处理它。

于 2014-05-30T06:17:25.580 回答