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(“父处理”)
}
这意味着父处理在这里基本上是无用的,因为您可以从模式匹配中扣除
我想这里的重点是一直在思考这些部分函数是如何组合的,因为一些模式匹配分支可能永远无法到达。在这种情况下,将永远无法到达父处理,因为它基本上被覆盖。除此之外,部分函数真的很酷 我希望这有帮助:)