作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
感谢对 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/
我是一名优秀的程序员,十分优秀!