Ich habe eine List
von Artikeln (in diesem Fall Spray Marshallers), die ich im aktuellen Kontext implizit verfügbar machen möchte. Nur zur Klarstellung: Ich will nicht, dass die List
selbst implizit verfügbar ist, sondern jedes Element der Liste. Hat jemand einen Trick, um das zu tun? Oder ist das eigentlich nicht möglich, da die genauen implizits zur Kompilierzeit zur Verfügung stehen müssen?Wie stelle ich den Inhalt einer Scala-Liste implizit zur Verfügung?
Antwort
In diesem speziellen Fall, wenn ich richtig verstanden habe, müssen Sie alle Ihre spezifischen Marshaller in einem Kontext verfügbar haben, daher müssen Sie jeden von ihnen implizit bereitstellen.
Sie sollten sie in ein Objekt einfügen und sie als implizite Werte definieren.
object Protocol {
implicit val marshaller1: ...
implicit val marshaller2: ...
}
Dann wird durch das Protocol
Objekt importieren, würden Sie alle Ihre Einweiser implizit zur Verfügung haben.
Und um Ihre Frage zu beantworten, ja, implicits werden zur Kompilierzeit gelöst. Wenn Sie also einen bestimmten Marshaller verwenden müssen, sucht der Algorithmus für die implizite Auflösung nach einem value
des spezifischen Marshaller-Typs. Deshalb können Sie es nicht von einer Liste bekommen, sagen wir, und Sie sollten das auch nicht wollen.
Dies funktioniert nur, wenn die verschiedenen Marshaller als unterschiedliche Typen deklariert sind. Siehe Kommentar oben. Wenn Sie nicht einverstanden sind, geben Sie bitte den funktionierenden Code an. – WillD
Ihre Antwort ließ mich erkennen, dass ich mit meiner Lösung auf der falschen Spur war ... Danke, dass Sie mich zur Besinnung gebracht haben;) –
@ Jan-Pieter Ich bin wirklich froh. –
Sie können dies sicherlich erreichen mit unförmigen:
import shapeless._
import shapeless.ops.hlist.Selector
case class A()
case class B()
case class C()
val list : A :: B :: C :: HNil = A() :: B() :: C() :: HNil
def screamIfAccessible[T](implicit selector: Selector[A :: B :: C :: HNil ,T]) = {
selector(list) // Actually picks the T type element
// from the HList to work with
println("YAY!")
}
screamIfAccessible[A]
screamIfAccessible[B]
Shapeless - Generic programming with scala
Jede Methode in Ihrem Code, der den Zugriff auf ein Element vom Typ A aus der Liste muss (oder in diesem Fall hList) muss Haben Sie das Selector
implizite Argument
- 1. Wie stelle ich einer Saga eine Geschichtsinstanz zur Verfügung?
- 2. Wie stelle ich ein Plugin mit Datenfunktionen zur Verfügung?
- 3. ionic2 Wie stelle ich/@ ein OpaqueToken zur Verfügung?
- 4. Wie stelle ich Team City eine Datei zur Verfügung?
- 5. Wie stelle ich meinen Webservice für Universe zur Verfügung?
- 6. Wie stelle ich eine Testdatenquelle im Frühjahr zur Verfügung?
- 7. Wie stelle ich ein Webprojekt über gh-pages zur Verfügung?
- 8. Wie stelle ich meine eigene 'clean_is_staff' auf UserChangeForm zur Verfügung?
- 9. Clojure und HugSQL; Wie stelle ich SQL Schlüsselwörter zur Verfügung?
- 10. Wie stelle ich ctrl + C im Shell-Skript zur Verfügung?
- 11. Wie stelle ich Picker eine Standardoption "Bitte auswählen ..." zur Verfügung?
- 12. Wie stelle ich einen SSL-Socket zwischen Funktionen zur Verfügung?
- 13. Wie stelle ich ResultSet als JSON/XML über den Webservice zur Verfügung?
- 14. Wie stelle ich den Zugriff auf interne Projektklassen über eine DLL zur Verfügung
- 15. Wie stelle ich den Anwendungskontext für alle Klassen in der Anwendung in der App zur Verfügung?
- 16. Wie stelle ich die integrierte Sicherheits- und Benutzerverwaltung einer MVC-Anwendung zur Verfügung?
- 17. Wie stelle ich einer bestehenden Schnittstelle eine fassade-Klasse zur Verfügung?
- 18. Wie deklariere ich ein Objekt aus einer Bedingung und stelle es über den Rest der Funktion zur Verfügung?
- 19. Wie stelle ich Parameter für die Komponente zur Verfügung, wenn ich mit imperativen Dialogen arbeite?
- 20. Wie stelle ich Ack das Verzeichnis zur Verfügung, das ich durchsuchen möchte?
- 21. Wie stelle ich einen Konstruktor nur für die Factory-Klasse zur Verfügung?
- 22. Warum ändern Schienen, die Helfer bilden, die ID/Name, den ich zur Verfügung stelle, und wie kann ich es stoppen?
- 23. Wie stelle ich Pods mit CocoaPods für ALLE Projekte in meinem Arbeitsbereich zur Verfügung?
- 24. Wie stelle ich Interfaces Property über WCF in VB.NET zur Verfügung?
- 25. Wie stelle ich alle URLs in meinem S3-Bucket für das öffentliche Browsing nicht zur Verfügung?
- 26. Wie stelle ich eine Funktion in einem Python-Modul zur Verfügung?
- 27. Wie stelle ich das Manifest während eines Maven/Surefire-Komponententests "mvn test" zur Verfügung?
- 28. swagger-codegen - Wie stelle ich der generierten C# SDK-Methode einen Textkörper zur Verfügung?
- 29. Wie stelle ich eine Erweiterungsmethode für die Schnittstelle in allen implementierenden Klassen zur Verfügung?
- 30. Wie stelle ich die sichtbare Eigenschaft eines Bildes in einem Benutzersteuerelement (C#) zur Verfügung?
Haben Sie einen Beispielcode wo/wie Sie es verwenden würden? – Soapy
Für jeden Typ kann nur eine Instanz durch implizite Suche ausgewählt werden. Wenn mehrere Instanzen verfügbar sind und die implizite Suche nicht auswählen kann, erhalten Sie 'error: ambiguous implizite values'. Jedes Element in einer "Liste [T]" hat den Typ "T". Wie würde das funktionieren? –
Etwas mehr Kontext: Ich habe versucht, eine Direktive als Teil einer Bibliothek zu erstellen, die Benutzern erlauben würde, mehrere Versionen ihrer HTTP API zu haben. Diese Richtlinie würde die richtigen Marshaller in den Geltungsbereich bringen. Diese Lösung kombiniert jedoch die Kompilierzeit und die Laufzeitlogik w.r.t. impliziert. Ich habe jetzt einen anderen Pfad gewählt: eine benutzerdefinierte "vollständige" Direktive, die die ursprüngliche ersetzt und eine implizite Liste von Marshallern als Argument verwendet. Diese Direktive wählt den richtigen Marshaller aus und erstellt die Antwort. Klappt wunderbar! Danke für deine Beiträge! –