gpt4 book ai didi

Scala 宏 : Checking for a certain annotation

转载 作者:行者123 更新时间:2023-12-04 02:07:49 27 4
gpt4 key购买 nike

感谢对 my previous question 的回答,我能够创建一个函数宏,使其返回 Map将每个字段名称映射到它的类值,例如

...

trait Model

case class User (name: String, age: Int, posts: List[String]) extends Model {
val numPosts: Int = posts.length

...

def foo = "bar"

...
}

所以这个命令
val myUser = User("Foo", 25, List("Lorem", "Ipsum"))

myUser.asMap

返回
Map("name" -> "Foo", "age" -> 25, "posts" -> List("Lorem", "Ipsum"), "numPosts" -> 2)

这是哪里 Tuple s 为 Map生成(参见 Travis Brown 的 answer):
...

val pairs = weakTypeOf[T].declarations.collect {
case m: MethodSymbol if m.isAccessor =>
val name = c.literal(m.name.decoded)
val value = c.Expr(Select(model, m.name))
reify(name.splice -> value.splice).tree
}

...

现在我想忽略具有 @transient 的字段注解。我如何检查一个方法是否有 @transient注解?

我正在考虑将上面的代码段修改为
val pairs = weakTypeOf[T].declarations.collect {
case m: MethodSymbol if m.isAccessor && !m.annotations.exists(???) =>
val name = c.literal(m.name.decoded)
val value = c.Expr(Select(model, m.name))
reify(name.splice -> value.splice).tree
}

但我在 exists 中找不到我需要写的内容部分。我将如何获得 @transient作为 Annotation所以我可以通过它吗?

提前致谢!

最佳答案

注释将在 val 上本身,而不是访问器。访问 val 的最简单方法是通过accessed方法在 MethodSymbol :

def isTransient(m: MethodSymbol) = m.accessed.annotations.exists(
_.tpe =:= typeOf[scala.transient]
)

现在你可以在你的 collect 中写下以下内容:
case m: MethodSymbol if m.isAccessor && !isTransient(m) =>

注意 isTransient的版本我在这里给出的必须在您的宏中定义,因为它需要来自 c.universe 的导入,但您可以通过添加 Universe 将其分解。如果你在几个宏中做这种事情,那么争论。

关于Scala 宏 : Checking for a certain annotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17236066/

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