以下代码:
class HotSwapActor extends Actor {
import context._
def angry: PartialFunction[Any, Unit] = {
case "foo" => sender ! "I am already angry!"
case "bar" => become(happy)
}
def happy: PartialFunction[Any, Unit] = {
case "bar" => sender ! "I am already happy :-)"; unbecome
case "foo" => become(angry)
}
def receive = {
case "foo" => become(angry)
case "bar" => become(happy)
}
}
class OtherActor extends Actor {
val system = ActorSystem()
val actor = system.actorOf(Props[HotSwapActor])
def receive = {
case "start" =>
actor ! "foo"
actor ! "bar"
actor ! "bar"
actor ! "foo"
case a @ _ => println(a)
}
}
object HotSwapMain extends App {
val system = ActorSystem()
val actor = system.actorOf(Props[OtherActor])
actor ! "start"
}
有输出:
我很高兴: - )
但不是吗
我已经开心了:-)我已经生气了!
或者我在幸福的PartialFunction的栏案例中错过了 unbecome 中的不良语义?
答案 0 :(得分:26)
这就是流程。
receive
收到消息。 angry
成为接收函数。任何下一条消息都将发送到angry
angry
收到消息。 happy
成为接收函数。任何下一条消息都将发送到happy
已发送消息“栏” - > happy
收到消息。它回复了I am already happy :-)
消息。然后它unbecomes
。
对context.become
以前的所有调用按照api,discardOld
默认设置为true。现在更换后,没有什么可以成为下一个接收器。它采用默认值,即receive
作为接收器
已发送消息“foo” - > receive
收到消息。 angry
成为接收函数。任何下一条消息都将发送到angry
答案 1 :(得分:3)
成为可选的第二个参数'discardOld'。默认情况下这是真的。这样就不会维护堆栈。如果你想要维护堆栈,并得到结果 - “我已经开心了:-)我已经生气了!”,将参数discardOld = false传递给你的函数。