Ich möchte eine Art Basis-ID-Generator implementieren, die ich so nennen kann:Typ basierend Id-Generator mit Shapeless
val nextPersonId = idGen.id[Person]
Ich würde IdGen wie ein Merkmal zu sein (wenn möglich):
trait IdGen[L <: HList] {
def id[T] = {
if (T is an element in the L type) return 0L + number of previous calls for this T
else throw new RuntimeException("no such T in L")
}
}
class MyDao extends IdGen[Person :: Booking :: Charges :: HNil] {
//something needed here?
}
Wie soll man das mit Shapeless umsetzen?
Ich habe versucht, mit scala Reflexion TypTag und iterieren über die toString Ergebnis, aber es ist hässlich.
Ich bin mir nicht ganz sicher, was Sie hier machen wollen. Soll der Compiler die IDs für Sie erhöhen? Soll der Compiler die Verwendung eines bestimmten ID-Generators einfach erzwingen? Ersteres wird nicht möglich sein, wenn IDs zur Laufzeit generiert werden sollen, da sich die Anzahl der generierten IDs möglicherweise auf Basis des Kontrollflusses ändert. Letzteres erfordert möglicherweise keine Shapeless, je nachdem, was Sie versuchen zu tun. – badcook
@badcook Ich schreibe eine Antwort mit toString Parsing des TypeTag von L mich selbst, und es wird hoffentlich klarer :) – eirirlar