長い質問をしましたが、コードが多すぎて整理できないようです。そのため、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
誰でもこのエラーを説明できますか? ありがとう。