Ich habe den nächsten Code:rekursive Druckfeldname bei Klasse über formlos
trait X
case class Bar(id: Int) extends X
case class Foo(id: Int, bar: Bar) extends X
ich will für Foo
mit inneren Klassen alle Felder drucken, die ich für sie formlos verwenden, und erstellen Poly:
object print1 extends Poly1 {
implicit def c[K, V](
implicit wk: Witness.Aux[K]) = {
at[FieldType[K, V]](field => {
wk.value
})
}
}
val foo = Foo(1, Bar(10))
val fooLgen = LabeledGeneric[Foo]
pritnln(fooLgen.to(foo).map(print1)) // => 'id::'bar
Aber wie mit internen Klassen drucken?
erklären, wie formlos zu verstehen, für welche Methode sollte verwendet werden? und warum ist es unmöglich, LabeledGeneric mit der ursprünglichen 'c'-Methode zu verwenden? – mike
formlos funktioniert zur Kompilierzeit, so dass Sie Rekursion auf der Typenebene erstellen müssen, mit implicits. 'c' und' cSub' existieren zur gleichen Zeit für den gleichen Schlüssel, Sie können entscheiden, welcher zuerst aufgelöst wird, indem Sie denjenigen mit niedrigerer Priorität in einem Supertrait deklarieren. Suchen Sie nach den skalaren impliziten Auflösungsregeln –
ah, habe es vergessen, danke. – mike