Oft müssen wir die Code-Kontextinformationen wie den Benutzer, der die Aktion ausführt, übergeben. Wir verwenden diesen Kontext für verschiedene Dinge wie Berechtigungsprüfungen. In diesen Fällen können sich implizite Werte als sehr nützlich erweisen, um den Kesselplattencode zu reduzieren.scala implizite extrahierte Werte im Mustervergleich?
Lassen Sie uns sagen, dass wir einen einfachen Ausführungskontext haben, dass wir um passieren: case class EC(initiatingUser:User)
Wir können praktisch Wachen haben:
def onlyAdmins(f: => T)(implicit context:EC) = context match{
case EC(u) if(u.roles.contain(Role.ADMIN)) => f
case _ => throw new UnauthorizedException("Only admins can perform this action")
}
val result = onlyAdmins{
//do something adminy
}
ich mich vor kurzem in Not gefunden, dies zu tun, wenn sie mit Akka Schauspieler arbeiten, aber Sie verwenden Mustererkennung und ich muss noch eine gute Möglichkeit finden, um zu bewirken, dass die Arbeit mit Extraktoren gut funktioniert.
Zunächst müßten Sie den Kontext mit jedem Befehl übergeben, aber das ist einfach:
case class DeleteCommand(entityId:Long)(implicit executionContext:EC)
//note that you need to overwrite unapply to extract that context
Aber die Empfangsfunktion wie folgt aussieht:
class MyActor extends Actor{
def receive = {
case DeleteCommand(entityId, context) => {
implicit val c = context
sender ! onlyAdmins{
//do something adminy that also uses context
}
}
}
}
Es wäre viel einfacher, wenn extrahierten Variablen könnte als implizit markiert sein, aber ich habe diese Funktion nicht gesehen:
Ar Sind Ihnen alternative Möglichkeiten zur Kodierung bekannt, so dass der Vorlageindex reduziert wird?
Sie könnten daran interessiert sein: http://stackoverflow.com/questions/6156656/how-to-pattern-match-a-class-with-multiple-argument-lists – gzm0
Das klingt wie das, was GADTs tun Sie in Haskell, wenn Sie die Ähnlichkeit von typeclass Kontexten zu implicits betrachten. Es könnte auch eine prinzipielle Möglichkeit bieten, GADT-ähnliche Mustervergleiche in Scala durchzuführen, die gut funktionieren. –