在scala中扩展部分实现的部分函数

时间:2013-01-09 14:26:55

标签: scala akka actor traits partialfunction

我在这里使用Akka actor库。 actors库定义了一个部分函数“receive”,扩展“actor”的actor必须实现处理各种消息。我正在为我的应用程序创建一个特征层次结构,其中trait“clockActor”扩展了Actor,“MasterClock”和“SubClock”扩展了“clockActor”。我想在“时钟”特性的接收功能中添加时钟的通用功能,但是如何在主时钟和副时钟特性中为接收功能添加额外的功能?

简而言之,我需要一种方法来向部分函数添加额外的case语句。 想法?

2 个答案:

答案 0 :(得分:14)

如上所述,您可以使用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 ... =>  ...
    }

}

答案 1 :(得分:1)

要想到的一件事就是做这样的事情:

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