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)
Map
ためTuple
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
としてどのように受け取ることができますか?
ありがとうございます!
もう一度おねがいします!私は注釈を得ることができない。上記の例のクラスで 'name'と' numPosts'の前に '@ transient'を追加しましたが、それらはまだマップに追加されています。不思議なことに、 'isTransient'を通過したメソッドのどれもが利用可能なアノテーションを持っていないようです。 「m.accessed.annotations」と「m.annotations」の両方が空です。 – Emre
これは非常に奇妙です。どちらの場合でも期待通りに動作します。おそらく正確なコードを投稿できますか? –
[code](http://pastebin.com/PmW5qg3P)はこちらです。ここでは、ここで少し異なるものを構築していることに注意してください - 指定されたパッケージのすべてのフィールドとフィールド・タイプのケース・クラスのマップ。問題はWeakTypeTagを持たないのですか?前もって感謝します。 – Emre