2014-07-09 13 views
7

Tôi đang viết mã chung để xử lý danh sách các cá thể kiểu chữ, thu thập các giá trị trong mỗi trường, kết hợp và sau đó chuyển nó vào thư viện.Làm thế nào để liệt kê shapeless Ghi lại và truy cập các phím trường trong thời gian chạy?

Sử dụng chức năng hình thù LabelledGeneric và đa hình, nó trông như thế này:

object toNamedSingletonListOfValues extends Poly1 { 
    implicit def caseField[K,T] = 
    at[FieldType[K, T]](field => { field.key -> List[T](field) }) 
} 

val generic = LabelledGeneric[MyClass] 
val records = listOfMyClassInstances.map(generic.to) 
val values = records.map(_.map(toNamedSingletonListOfValues)) // Then combining and passing 

Tuy nhiên, tôi cần một cách để nhận field.key vì thư viện cần các tên tham số.

Bạn có nhớ đề xuất giải pháp không?

Trả lời

0

Tìm thấy bẩn Hack là để đảm Poly trông giống như:

import scala.reflect.runtime.universe._ 

object toNamedSingletonListOfValues extends Poly1 { 
    implicit def caseField[K: TypeTag, T] = at[FieldType[K, T]] { field => 
    (typeOf[K] match { case TypeRef(_, _, args) => args }).last.toString.drop("java.lang.String(\"".size).dropRight(2) -> List[T]() 
    } 
} 

Có một giải pháp đẹp hơn xung quanh?

11

Bạn có thể truy cập vào chìa khóa (được biết đến tại thời gian biên dịch) như là một giá trị thời gian chạy qua một thể hiện của lớp Witness loại:

object toNamedSingletonListOfValues extends Poly1 { 
    implicit def caseField[K, T](implicit wk: Witness.Aux[K]) = 
    at[FieldType[K, T]](field => { wk.value -> List[T](field) }) 
} 

Không cần phản ánh thời gian chạy!

+0

Cảm ơn bạn! Tôi có một số thứ để viết lại ngay bây giờ, nhưng nó thực sự cho phép tiến bộ cho tôi. BTW, tôi đã cố gắng sử dụng Aux'es, tuy nhiên, tôi không thể tìm ra Aux từ những gì đối tượng tôi cần phải sử dụng. Không có tài liệu nào cho Aux'es và hầu như không thể suy ra kiến ​​thức này từ mã nguồn không có định dạng, vì các định nghĩa Aux nằm rải rác trên tất cả các tệp mã nguồn không hoạt động. –

+0

Các kiểu 'Aux' đều được ghép nối với một lớp kiểu cụ thể và được thiết kế để quảng bá một thành viên kiểu vào một tham số kiểu. Bạn có thể viết nó với 'wk: Witness {type T = K}', nhưng phiên bản 'Aux' thì đẹp hơn. –

Các vấn đề liên quan