Scala 如何使akka actor在响应某些消息方面具有通用性?

Scala 如何使akka actor在响应某些消息方面具有通用性?,scala,akka,Scala,Akka,我有一个演员,我需要把它抽象出来,因为它在很多地方被用作一种常见的模式 abstract class SomeActor(.....) extends Actor with ActorLogging { def receive = { case Message1 => case Message2 => case Message3 => } } 现在,假设我需要自定义一个参与者实现来处理Message2的逻辑,那么我有哪些选项来实现这一点呢?接

我有一个演员,我需要把它抽象出来,因为它在很多地方被用作一种常见的模式

abstract class SomeActor(.....) extends Actor with ActorLogging {

  def receive = {
    case Message1 =>
    case Message2 =>
    case Message3 =>
  }
}

现在,假设我需要自定义一个参与者实现来处理Message2的逻辑,那么我有哪些选项来实现这一点呢?

接收功能是一个非常有用的功能,因此我们可以利用它。例如,分部函数提供了一些可以使用的有用运算符

这意味着您可以在父参与者中定义一个
PartialFunction[Any,Unit]
,然后在子参与者中定义另一个,并通过组合这些来定义receive。让我们看一些代码

抽象类父类扩展了Actor{
def commonReceive:接收={
案例CommonHandledMessage=>
println(“普通处理”)
案例消息=>
println(“父处理”)
}
}
类子级扩展了Actor{
覆盖val接收:接收=specializedReceive或LSE commonReceive
def specializedReceive:接收={
案例消息=>
println(“子处理”)
}
}
但是,您应该小心组合这些部分函数的方式,因为您可能会对结果感到惊讶。当您使用orElse组合器时,部分函数基本上是相互叠加的。因此,您可以想象我们在上面定义的
receive
方法将转换为如下内容:

覆盖val接收:接收={
案例消息=>
println(“子处理”)
案例CommonHandledMessage=>
println(“普通处理”)
案例消息=>
println(“父处理”)
}
这意味着父处理在这里基本上是无用的,因为您可以从模式匹配中扣除


我想这里的重点是一直在思考这些部分函数是如何组合的,因为一些模式匹配分支可能永远无法到达。在这种情况下,将永远无法到达父处理,因为它基本上被覆盖。除此之外,部分函数真的很酷


我希望这会有所帮助:)

接收功能是一个非常有用的功能,因此我们可以利用它来发挥我们的优势。例如,分部函数提供了一些可以使用的有用运算符

这意味着您可以在父参与者中定义一个
PartialFunction[Any,Unit]
,然后在子参与者中定义另一个,并通过组合这些来定义receive。让我们看一些代码

抽象类父类扩展了Actor{
def commonReceive:接收={
案例CommonHandledMessage=>
println(“普通处理”)
案例消息=>
println(“父处理”)
}
}
类子级扩展了Actor{
覆盖val接收:接收=specializedReceive或LSE commonReceive
def specializedReceive:接收={
案例消息=>
println(“子处理”)
}
}
但是,您应该小心组合这些部分函数的方式,因为您可能会对结果感到惊讶。当您使用orElse组合器时,部分函数基本上是相互叠加的。因此,您可以想象我们在上面定义的
receive
方法将转换为如下内容:

覆盖val接收:接收={
案例消息=>
println(“子处理”)
案例CommonHandledMessage=>
println(“普通处理”)
案例消息=>
println(“父处理”)
}
这意味着父处理在这里基本上是无用的,因为您可以从模式匹配中扣除


我想这里的重点是一直在思考这些部分函数是如何组合的,因为一些模式匹配分支可能永远无法到达。在这种情况下,将永远无法到达父处理,因为它基本上被覆盖。除此之外,部分函数真的很酷

我希望这有帮助:)