Często potrzebujemy przechodzić przez informacje kontekstowe kodu, takie jak użytkownik, który wykonuje akcję. Używamy tego kontekstu do różnych czynności, takich jak sprawdzanie uprawnień. W tych przypadkach wartości domyślne mogą okazać się bardzo przydatne w zmniejszeniu kodu płyty kotła.scala niejawne wartości wyodrębnione w dopasowywaniu wzorca?
Powiedzmy mamy proste kontekst wykonania, które przechodzą wokół: case class EC(initiatingUser:User)
Możemy mieć poręczne strażników:
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
}
Niedawno znalazłem się w potrzebie, aby to zrobić, gdy pracuje z aktorami Akka ale używają dopasowywania wzorców i mam jeszcze znaleźć dobry sposób na to, aby implicite działały dobrze z ekstraktorami.
Najpierw trzeba by przekazać kontekst z każdym poleceniem, ale to jest proste:
case class DeleteCommand(entityId:Long)(implicit executionContext:EC)
//note that you need to overwrite unapply to extract that context
Ale odbierać funkcja wygląda tak:
class MyActor extends Actor{
def receive = {
case DeleteCommand(entityId, context) => {
implicit val c = context
sender ! onlyAdmins{
//do something adminy that also uses context
}
}
}
}
byłoby znacznie prostsze, jeśli wyodrębnionych zmiennych można oznaczyć jako niejawne, ale nie widziałem tej funkcji:
def receive = {
case DeleteCommand(entityId, implicit context) => sender ! onlyAdmins{
//do something adminy (that also uses context)
}
}
Ar Czy znasz jakieś alternatywne sposoby kodowania, aby zmniejszyć kod podstawowy?
Możesz być zainteresowany w tym: http://stackoverflow.com/questions/6156656/how-to-pattern-match-a-class-with-multiple-argument-lists – gzm0
To brzmi jak co GADTs w Haskell, jeśli weźmiesz pod uwagę podobieństwo kontekstów typeclass do implicite. Może to również zapewnić bardziej zasadniczy sposób wykonywania dopasowań podobnych do GADT w Scali, która działa dobrze. –