scala – 在宏中匹配子类
发布时间:2020-12-16 08:43:38 所属栏目:安全 来源:网络整理
导读:我需要将字符串值转换为实际类型,所以我决定尝试宏方式来执行此操作.我有一堆数据类型: sealed abstract class Tag(val name: String)case object Case1 extends Tag("case1")case object Case2 extends Tag("case2")case object Case3 extends Tag("case3"
我需要将字符串值转换为实际类型,所以我决定尝试宏方式来执行此操作.我有一堆数据类型:
sealed abstract class Tag(val name: String) case object Case1 extends Tag("case1") case object Case2 extends Tag("case2") case object Case3 extends Tag("case3") etc... 我想写一个简单的解析器: val tag: Tag = TagResolver.fromString("case2") 该行应分别返回Case2.我经理要做以下事情: def typeFromString(c: Context)(name: c.Expr[String]): c.Expr[Tag] = { import c.universe._ val tag = typeTag[Tag] val accSymb = tag.tpe.typeSymbol.asClass val subclasses = accSymb.knownDirectSubclasses // all my cases subclasses.map { sub => val name = sub.typeSignature.member(newTermName("name")).asMethod // name field ??? } } 但是如何匹配name:c.Expr [String]与name字段的值匹配,如果匹配则返回相应的标签? 解决方法
我认为没有可靠的方法,因为knownDirectSubclasses可以引用尚未编译的类,因此我们无法评估它们.
如果您可以将这些值作为注释放在类上,那么即使在当前编译运行中编译类(通过Symbol.annotations API),也可以读取这些注释.但请注意,knownDirectSubclasses存在已知问题:https://issues.scala-lang.org/browse/SI-7046. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |