如果我通过context become(foo, discardOld = false)
堆叠了行为,是否有办法将消息推迟到行为堆栈中?
假设我已经叠加了上下文foo
和bar
。两者都对Baz
消息(以及其他消息)进行了一些处理 - 如果foo
位于行为堆栈的顶部,是否有办法将Baz
消息传递给{ {1}}?
我认为bar
警卫会阻止一个级别消费该消息,但是在传递消息之前,这仍会使case
级别的副作用更加复杂 - 警卫会有是一个执行副作用的功能。
编辑其中:
我已经将堆叠的上下文用作类层次结构的(某种)替代方法。在较低级别的上下文中,所有这些actor都共享了一些基本行为,然后在区分actor之后添加了一个层中的其他行为。这是一种“替代”,因为演员可能实际上需要改变“类”以响应消息(同时保留自己,以便其他具有这些句柄的演员不需要替换一堆裁判等) 。我希望能够做的就是有条件地调用foo
,同时在正确的概念层/位置保持副作用。
答案 0 :(得分:1)
您可以使用Stash Trait(http://doc.akka.io/api/akka/2.0/akka/actor/Stash.html)并存储特定类型的所有消息。然后,您可以解除所有隐藏的消息并使用您的“新”(堆栈中较低的)接收行为来处理它们,因为它们不符合无意处理它们的行为。这听起来不像你想要的那样,但可能很有用。
回复您的修改:
如果你想要一个基础角色,然后让演员略微修改基础角色的接收方法,你可以使用抽象覆盖。这完全不同,堆叠接收但应该完成你正在寻找的东西:
class Base extends Actor {
def receive {
case Baz => println("BASIC BEHAVIOR")
case _ => println("other messages")
}
}
trait BaseWithOtherWayToHandleBaz extends Base {
def otherRecieve: Recieve = {
case Baz => println("OVERRIDE BEHAVIOR")
}
abstract override def receive = otherRecieve orElse super.receieve
}
答案 1 :(得分:0)
Receive
是PartialFunction
,您可以使用orElse
或andThen
撰写邮件。