特定のデバッグ目的で、実行時にフィールドを検査できるように、ケース クラスに混在できる (Scala 2.8 の) トレイトを作成しようとしています。ソース ファイルで宣言された順序に戻して、ケース クラス内の他のフィールドを省略したいと考えています。例えば:
trait CaseClassReflector extends Product {
def getFields: List[(String, Any)] = {
var fieldValueToName: Map[Any, String] = Map()
for (field <- getClass.getDeclaredFields) {
field.setAccessible(true)
fieldValueToName += (field.get(this) -> field.getName)
}
productIterator.toList map { value => fieldValueToName(value) -> value }
}
}
case class Colour(red: Int, green: Int, blue: Int) extends CaseClassReflector {
val other: Int = 42
}
scala> val c = Colour(234, 123, 23)
c: Colour = Colour(234,123,23)
scala> val fields = c.getFields
fields: List[(String, Any)] = List((red,234), (green,123), (blue,23))
上記の実装は、Product 内のフィールドの位置とその名前の間の関係をそれらのフィールドの値の等価性によって推測するため、明らかに欠陥があります。
Colour(0, 0, 0).getFields
これを実装する方法はありますか?