Расширение частично реализованной частичной функции в Scala
Я использую библиотеку актеров Akka здесь. Библиотека акторов определяет частичную функцию "получать", которую должен реализовать актер, расширяющий "актер", чтобы иметь дело с различными сообщениями. Я создаю иерархию признаков для моего приложения, где черта "clockActor" расширяет Actor, а "MasterClock" и "SubClock" расширяют "clockActor". Я ищу, чтобы добавить общую функциональность часов в функцию приема черты "clock", но как мне добавить дополнительную функциональность к функции приема в чертах master и sub clock?
Короче говоря, мне нужен способ добавить дополнительные операторы case к частичной функции. Идеи?
2 ответа
Как уже предлагалось, вы можете легко составить PartialFunctions
с помощью orElse
trait ClockActor {
def commonOp = {
case ... => ...
}
}
class MasterClock extends Actor with ClockActor {
def receive = commonOp orElse masterOp
def masterOp = {
case ... => ...
}
}
class SubClock extends Actor with ClockActor {
def receive = commonOp orElse subOp
def subOp = {
case ... => ...
}
}
Одна вещь, которая приходит на ум, это сделать что-то вроде этого:
trait ClockActor {
def pf:PartialFunction[String, Boolean] = {
case "a" => true
case v if(_pf.isDefinedAt(v)) => _pf.apply(v)
}
def _pf:PartialFunction[String, Boolean] = Map.empty
}
object MasterClock extends ClockActor {
override def _pf:PartialFunction[String, Boolean] = {
case "b" => false
}
println(pf("a"))
println(pf("b"))
}
который выведет:
scala> MasterClock
true
false
Значение true
происходит от определения в частичной функции Черты ClockActor
, false
исходит от объекта MasterClock
,