Расширение частично реализованной частичной функции в 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,

Другие вопросы по тегам