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的语义

  • 消息“foo”已发送-->
    receive
    接收消息<代码>愤怒成为接收功能。下一条消息将被发送到
    angry
  • 消息“bar”已发送-->
    生气
    接收消息<代码>快乐成为接收功能。任何下一条消息都将发送到
    happy
  • 消息“bar”已发送-->
    happy
    接收消息。它回复了
    我已经很高兴了:-)
    消息。然后它
    不符合
    。 根据前面对
    context.been
    的所有调用,
    discardoold
    被设置为默认值true。现在,在更换了它自己之后,没有什么东西可以成为下一个接收器了。它将默认的一个,即
    receive
    作为接收器

  • 消息“foo”已发送-->
    receive
    接收消息<代码>愤怒成为接收功能。下一条消息将被发送到
    angry


  • Been接受可选的第二个参数“DiscardorOld”。默认情况下,这是正确的。这样就不会维护堆栈。如果您希望维护堆栈,并且得到的结果为“我已经高兴了:-)我已经生气了!”,请将参数DiscardorOld=false传递给Been函数。

    @Randall非常同意。我用它作为一个隐喻来解释它作为处理信息的功能。所以我不得不给它起个名字。因为它是
    Receive
    类型,所以我使用了it@RandallSchulz正如您所说的,成为/取消成为推送/弹出堆栈。然而,在这个示例中,unbecome直接将receive设置为消息处理程序,而不是前面的方法。它替换了top方法。API文档声明:将参与者的行为更改为新的“接收”(PartialFunction[Any,Unit])处理程序。此方法对行为堆栈的作用如下:如果discardOld=true,它将替换顶部元素(即当前行为)如果discardOld=false,它将保留当前行为,并将给定的行为推到默认行为的顶部。选择替换当前行为是为了避免在编写客户端代码时发生内存泄漏,而没有首先查阅本文档(即始终推送新闭包,决不发出unbecome())。