Scala 误解阿克卡变得/不合适
以下代码:Scala 误解阿克卡变得/不合适,scala,akka,Scala,Akka,以下代码: 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 "
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"
}
具有以下输出:
我已经很高兴了:-)
但不是吗
我已经高兴了:-)我已经生气了
还是我在快乐部分功能的栏中缺少了unbecome中unbecome的语义
receive
接收消息<代码>愤怒成为接收功能。下一条消息将被发送到angry
生气
接收消息<代码>快乐成为接收功能。任何下一条消息都将发送到happy
happy
接收消息。它回复了我已经很高兴了:-)
消息。然后它不符合
。
根据前面对context.been
的所有调用,discardoold
被设置为默认值true。现在,在更换了它自己之后,没有什么东西可以成为下一个接收器了。它将默认的一个,即receive
作为接收器receive
接收消息<代码>愤怒成为接收功能。下一条消息将被发送到angry
Been接受可选的第二个参数“DiscardorOld”。默认情况下,这是正确的。这样就不会维护堆栈。如果您希望维护堆栈,并且得到的结果为“我已经高兴了:-)我已经生气了!”,请将参数DiscardorOld=false传递给Been函数。@Randall非常同意。我用它作为一个隐喻来解释它作为处理信息的功能。所以我不得不给它起个名字。因为它是
Receive
类型,所以我使用了it@RandallSchulz正如您所说的,成为/取消成为推送/弹出堆栈。然而,在这个示例中,unbecome直接将receive设置为消息处理程序,而不是前面的方法。它替换了top方法。API文档声明:将参与者的行为更改为新的“接收”(PartialFunction[Any,Unit])处理程序。此方法对行为堆栈的作用如下:如果discardOld=true,它将替换顶部元素(即当前行为)如果discardOld=false,它将保留当前行为,并将给定的行为推到默认行为的顶部。选择替换当前行为是为了避免在编写客户端代码时发生内存泄漏,而没有首先查阅本文档(即始终推送新闭包,决不发出unbecome())。