我想寫一個特徵(斯卡拉2.8),可以混入一個案例類,允許它的字段在運行時檢查,爲特定的調試目的。我想按照它們在源文件中聲明的順序將它們取回,並且我希望省略case類中的任何其他字段。例如:斯卡拉案例類的反思
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))
以上實現顯然是有缺陷的,因爲它會猜測產品的一個領域的地位,它的名字由這些字段中的值的平等之間的關係,這樣下,比如說,將無法正常工作:
Colour(0, 0, 0).getFields
這有什麼辦法可以實現嗎?
有在你的代碼中的錯誤的例子。值不是唯一的,因此當移動時,您將使用(field.get(this) - > field.getName)覆蓋值,而不是一個字段具有給定名稱。 請參閱下面的代碼的重寫版本。 – 2013-03-27 10:33:09
@SagieDavidovich事實上,如上所述,「上述實現顯然存在缺陷」 – 2013-03-27 10:46:38