Tôi đang cố gắng để viết một đặc điểm (trong Scala 2.8) có thể được trộn lẫn vào một trường hợp lớp, cho phép các lĩnh vực của nó được kiểm tra trong thời gian chạy, cho một mục đích gỡ lỗi cụ thể. Tôi muốn đưa chúng trở lại theo thứ tự mà chúng đã được khai báo trong tệp nguồn và tôi muốn bỏ qua bất kỳ trường nào khác bên trong lớp chữ. Ví dụ:Reflection trên một trường hợp Scala
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))
Việc thực hiện ở trên là thiếu sót rõ ràng bởi vì nó đoán mối quan hệ giữa vị trí của một lĩnh vực trong sản phẩm và tên của nó bằng cách bình đẳng của các giá trị vào những lĩnh vực, do đó những điều sau đây, nói rằng, sẽ không làm việc :
Colour(0, 0, 0).getFields
Có cách nào để thực hiện điều này không?
Có một lỗi trong mã của bạn. Các giá trị không phải là duy nhất và do đó bạn sẽ ghi đè các giá trị bằng (field.get (this) -> field.getName) khi di chuyển hơn một trường có một tên đã cho. Xem phiên bản viết lại của mã bên dưới. –
@SagieDavidovich Thật vậy, như đã nói, "việc thực hiện ở trên rõ ràng là thiếu sót" –