2014-07-09 9 views
7

Her sınıftaki örnek sınıflarını, toplama değerlerini işlemek ve sonra da kitaplığa iletmek için genel kod yazıyor. LabelledGeneric şekilsiz ve polimorfik fonksiyonlarını kullanmaShapeless nasıl numaralandırılır Çalışma zamanında alan anahtarlarına kayıt olun ve erişin?

, bu şuna benzer:

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 

Ancak, kütüphane parametre adları gerektiğinden field.key almanın bir yolunu bulmalıyız.

Çözüm önerisini önerir misiniz?

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]() 
    } 
} 

güzel bir çözüm etrafında var mı:

cevap

0

Bulunan kirli kesmek Poly gibi görünmesi için mi?

11

Sen Witness tip sınıfının bir örneği üzerinden bir çalışma zamanı değeri olarak (derleme zamanında bilinir) tuşuna erişebilir:

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

çalışma zamanı yansıması gerek yok!

+0

Teşekkür ederiz! Şimdi tekrar yazmak için bazı şeylerim var, ama aslında benim için ilerleme sağladı. BTW, Aux'leri kullanmaya çalışıyordum, ancak, hangi nesneyi kullanmam gerektiğinden Aux'i anlayamadım. Aux'es için hiçbir belge yok ve bu bilgiyi tüm şekilsiz kaynak kod dosyalarına dağılmış olarak, bu bilgiyi şekilsiz kaynak kodundan çıkarmak neredeyse imkansız. –

+0

'Aux' türlerinin tümü, belirli bir tür sınıfıyla eşleştirilir ve bir tür üyesini bir tür parametresine yükseltmek için tasarlanmıştır. Bunu "wk: Witness {type T = K}" ile yazabilirsin, ama "Aux" versiyonu daha güzel. –

İlgili konular