我有一个我需要制作抽象的演员,因为它被用作许多地方使用的常见模式.
abstract class SomeActor(.....) extends Actor with ActorLogging {
def receive = {
case Message1 =>
case Message2 =>
case Message3 =>
}
}
Run Code Online (Sandbox Code Playgroud)
现在说我需要自定义一个actor实现来处理Message2的逻辑,我有什么选择才能实现这个目的?
该receive功能是一个PartialFunction[Any, Unit],所以我们可以在我们的优势使用.例如,部分函数提供了一些有用的运算符PartialFunction#orElse.
这意味着您可以在父actor中定义一个PartialFunction[Any, Unit]然后在子actor中另一个,并通过组合这些来定义receive.我们来看一些代码吧!
abstract class Parent extends Actor {
def commonReceive: Receive = {
case CommonHandledMessage =>
println("common handling")
case Message =>
println("parent handling")
}
}
class Child extends Actor {
override val receive: Receive = specializedReceive orElse commonReceive
def specializedReceive: Receive = {
case Message =>
println("child handling")
}
}
Run Code Online (Sandbox Code Playgroud)
但是,您应该小心组合这些部分函数的方式,因为您可能会对结果感到惊讶.当您使用orElse合并器时,部分函数基本上叠加在一起.所以你可以想象receive我们上面定义的方法转换成类似的东西:
override val receive: Receive = {
case Message =>
println("child handling")
case CommonHandledMessage =>
println("common handling")
case Message =>
println("parent handling")
}
Run Code Online (Sandbox Code Playgroud)
这意味着父处理在这里基本上没用,因为您可以从模式匹配中扣除.
我想这里的观点总是考虑如何组合这些部分函数,因为可能永远不会达到某些模式匹配分支.在这种情况下,永远不会达到父处理,因为它基本上是覆盖的.除此之外,部分功能真的很酷!
我希望有帮助:)