我正在动态创建一个枚举值。我有一个枚举类型(不是对象本身)和一个表示有效值的字符串,例如“Red”代表Color.Red。
// T is Color (enum). I've discovered the valueOf() method lives in the companion object
val sym = TypeRepr.of[T].classSymbol.get.companionClass
// Try to invoke the valueOf() method on the enum with the value, enumValue ("Red")
Apply(Select.unique(New(TypeIdent(sym)), "valueOf"), List('{ enumValue }.asTerm)).asExprOf[T]
字符串
它可以编译,但运行时非常不开心,不喜欢New,这是有道理的,因为我们不“new”对象。
在宏中动态调用valueOf的正确方法是什么?
1条答案
按热度按时间7d7tgy0s1#
字符串
打印:
型
删除
Inline
garbadge后:型
要构造这棵树(你的问题似乎是
Ident
),我想我们可以使用:用途:型
无论是动态构造还是在编译时构造,
Ref
的用法都是一样的。当我需要“静态”处理密封的层次结构时,我使用以下方法:
1.获取所有子类型的列表
型
1.将
Type
s转换为Expr
s型
1.处理某些子类型为
case class
es的情况(为上面的代码创建None)(实际上,Scala 3宏处理Java枚举与Scala 3枚举相同,没有任何括号,所以
|| isJavaEnumValue
有点多余-您可以删除它,它仍然可以与Scala 2的sealed
层次结构case object
s,Scala 3的enum
s和Javaenum
s一起工作)。正如你在这两种情况下所看到的,动态和静态,当我需要在Scala 3的enum/Java的enum/companion object的方法中访问case对象/无参数case时,我使用
Ref <: Term
将Symbol
转换为Term
(内部将是Ident
)。