前の質問への回答のおかげで、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
のMap
が生成される場所です (Travis Brown's 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
前もって感謝します!