[英]Scala Macro Annotations - Why doesn't my class appear to be updated when I use it as a type parameter?
僅將val添加到模板中並不會自動使其成為構造函數參數。 為此,構造函數本身也需要進行調整。 幸運的是,我們有准引用,與手動樹構建相比,它大大簡化了此任務。
case q"$mods class $name[..$tparams](..$first)(...$rest) extends ..$parents { $self => ..$body }" :: Nil =>
val CASEACCESSOR = (1 << 24).toLong.asInstanceOf[FlagSet]
val PARAMACCESSOR = (1 << 29).toLong.asInstanceOf[FlagSet]
val helloMods = Modifiers(CASEACCESSOR | PARAMACCESSOR | DEFAULTPARAM)
val helloVal = q"""$helloMods val x: String = "hello macro!""""
q"$mods class $name[..$tparams](..$first, $helloVal)(...$rest) extends ..$parents { $self => ..$body }"
請注意幾個怪癖:1)我們需要設置官方API中不存在的CASEACCESSOR和PARAMACCESSOR標志,以避免Salat崩潰; 2)我們需要設置DEFAULTPARAM,以確保scalac能夠識別默認值參數為默認值,3)無法推斷默認參數的類型,因此我們需要在此處顯式提供String。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.