Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala akka actor是否可以在不实现相同代码的情况下捕获所有状态中的特定消息_Scala_Akka - Fatal编程技术网

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
组合部分函数,如下面的代码所示

秩序很重要。因此,根据用例do
f1或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"