gpt4 book ai didi

scala - 是否可以在 Scala 宏中从 WeakTypeTag 生成 Apply?

转载 作者:行者123 更新时间:2023-12-04 17:50:35 24 4
gpt4 key购买 nike

我有一个 WeakTypeTag我的宏中的某种类型,我想生成如下代码:

macroCreate[SomeObject] // => SomeObject(1)

宏的定义将是这样的:
def macroCreate[A] = macro _macroCreate[A]
def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = {
c.Expr(Apply(Select(???, newTermName("apply")), List(c.literal(1).tree)))
}

问题是,我如何获得 Select对于给定的类型?

我可以使用将类型转换为字符串的解决方法,在 "." 上拆分然后创建一个 Select来自字符串列表,但这似乎很糟糕。

是否可以创建一个 Select直接从类型标签?

最佳答案

你可以得到伴星的符号,然后使用宇宙的Ident(sym: Symbol): Ident工厂方法:

def macroCreate[A] = macro _macroCreate[A]

def _macroCreate[A](c: Context)(implicit wtt: c.WeakTypeTag[A]) = {
import c.universe._

c.Expr(
Apply(
Select(Ident(wtt.tpe.typeSymbol.companionSymbol), newTermName("apply")),
c.literal(1).tree :: Nil
)
)
}

进而:
scala> case class SomeObject(i: Int)
defined class SomeObject

scala> macroCreate[SomeObject]
res0: SomeObject = SomeObject(1)

scala> macroCreate[List[Int]]
res1: List[Int] = List(1)

如果你真的是这个意思 SomeObject是对象的类型(即,不是其伴生类的类型),只需删除 .companionSymbol以上。

关于scala - 是否可以在 Scala 宏中从 WeakTypeTag 生成 Apply?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17399998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com