Scala akka actor是否可以在不实现相同代码的情况下捕获所有状态中的特定消息
我有一名演员负责管理不同的状态,例如:Scala akka actor是否可以在不实现相同代码的情况下捕获所有状态中的特定消息,scala,akka,Scala,Akka,我有一名演员负责管理不同的状态,例如: case object Start case object Stop case object Init class Foo extends Actor { def receive: Receive = { case Init => doSomeInit() context become busy self ! Start case Stop => context stop s
case object Start
case object Stop
case object Init
class Foo extends Actor {
def receive: Receive = {
case Init =>
doSomeInit()
context become busy
self ! Start
case Stop =>
context stop self
}
}
def busy: Receive = {
case Start =>
doingSomeProcessing()
context become receive
case Stop =>
context stop self
}
}
我希望避免在每个状态下编写停止处理代码(类似于在FSM中未处理时)
有没有惯用的方法不使用FSM就可以做到这一点?使用
orElse
并将常用消息移动到单独的部分功能。
接收
和忙
是部分功能。您可以使用orElse
组合部分函数,如下面的代码所示
秩序很重要。因此,根据用例dof1或f2
或f2或f1
f1,f2是部分函数
Scala REPL
scala> val f: PartialFunction[Int, String] = { case 1 => "one"}
f: PartialFunction[Int, String] = <function1>
scala> val g: PartialFunction[Int, String] = { case 2 => "two"}
g: PartialFunction[Int, String] = <function1>
scala> val x = f orElse g
scala> f(1)
res9: String = "one"
scala> x(2)
res10: String = "two"
scala> x(1)
res11: String = "one"
scala>val f:PartialFunction[Int,String]={case 1=>“one”}
f:部分函数[Int,String]=
scala>valg:PartialFunction[Int,String]={case2=>“two”}
g:部分函数[Int,String]=
scala>val x=f orElse g
scala>f(1)
res9:String=“一”
scala>x(2)
res10:String=“两个”
scala>x(1)
res11:String=“一”
谢谢,我想您在REPl示例中遗漏了val x=g或lse f
scala> val f: PartialFunction[Int, String] = { case 1 => "one"}
f: PartialFunction[Int, String] = <function1>
scala> val g: PartialFunction[Int, String] = { case 2 => "two"}
g: PartialFunction[Int, String] = <function1>
scala> val x = f orElse g
scala> f(1)
res9: String = "one"
scala> x(2)
res10: String = "two"
scala> x(1)
res11: String = "one"