Im Kern ist implicit
eine Möglichkeit, das Verhalten von Werten eines Typs auf eine lokale Ebene in Ihrem Programm und außerhalb des ursprünglichen Codes, der diese Werte definiert, zu steuern. Es ist ein Ansatz zur Lösung der expression problem.
Damit können Sie Ihre Kernkurse auf ihre grundlegendste Struktur und Verhalten konzentrieren und Verhalten auf höherer Ebene ausklammern. Es wird verwendet, um einen Ad-hoc-Polymorphismus zu erreichen, bei dem zwei formal nicht verwandte Datentypen nahtlos an dieselbe Schnittstelle angepasst werden können, so dass sie als Instanzen des gleichen Typs behandelt werden können.
Anstatt beispielsweise Ihre Datenmodellklassen mit JSON-Serialisierungsverhalten zu speichern, können Sie dieses Verhalten an anderer Stelle speichern und implizit ein Objekt mit der Fähigkeit zur Serialisierung erweitern. Dies führt zur Definition in einer implicit
Instanz, die angibt, wie Ihr Objekt als "JSON-serialisierbar" und nicht als sein ursprünglicher Typ angezeigt werden kann, und ohne dass der reale Typ des Objekts bearbeitet wird.
Es gibt verschiedene Formen von implicit
, die pretty thoroughly covered elsewhere sind. Zu den Anwendungsfällen gehören das "enhare-my-library" -Muster, das typeclass -Muster, implizite Konvertierungen und die Abhängigkeitsinjektion.
Was mich im Zusammenhang mit dieser Frage wirklich interessiert, ist, wie sich das von Ansätzen in anderen Sprachen unterscheidet.
Enhance-my-Bibliothek und typeclasses
In vielen anderen Sprachen, erreichen Sie dies durch Affen Patchen oder Erweiterungsmethoden (in der Regel, wo es keine Typprüfung ist). Diese Ansätze haben den Nachteil, unvorhersehbar zu komponieren und global anzuwenden. In statisch typisierten Sprachen ohne eine Möglichkeit, Klassen zu öffnen, müssen Sie normalerweise explizite Adapter erstellen. Dies hat den Nachteil einer Menge Standard. In statischen und dynamischen Sprachen können Sie vielleicht auch Reflektionen verwenden, aber normalerweise mit viel Zeremoniell und Komplexität.
In Haskell existieren Typklassen als ein erstklassiges Konzept. Sie sind jedoch global, sodass Sie nicht die lokale Kontrolle darüber erhalten, welche Typklasse in einer bestimmten Situation angewendet wird. In Scala steuern Sie über die importierten Module, welche Auswirkungen lokal im Bereich liegen. Und Sie können die implizite Auflösung immer ganz ausschließen, indem Sie Parameter explizit übergeben.
Menschen befürworten globale oder lokale Auflösung von Typklassen auf die eine oder andere Weise, je nachdem, wen Sie fragen.
Implizite Konvertierungen
Viele andere Sprachen haben keine Möglichkeit, dies zu erreichen. Aber es ist in Scala ziemlich verpönt geworden, vielleicht aus gutem Grund.
Sie mussten http://scalapuzzlers.com/ auf den Boden bringen. –
Holy Mir ist nicht klar, wie viele Rätsel es bei Scala gibt. – Ana
Diese Frage lässt viele schlechte Antworten zu, aber auch gute und prägnante. –