我正在尝试编写一个可以混合到案例类中的特征(在 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
有什么办法可以实现吗?