2014-01-29 45 views
1

如果我已经通过context become(foo, discardOld = false)叠加了行为,有没有办法将邮件推迟到行为堆栈?斯卡拉/阿卡 - 通过行为堆栈传递消息?

比方说,我有堆叠上下文foobar。两者都有一些处理Baz消息(其中包括) - 如果foo位于行为堆栈的顶部,是否有方法将Baz消息传递给bar

我猜想case警卫会阻止一个级别消费这个消息,但是在传递消息之前,这仍然会在foo级别使副作用更加复杂 - 警卫必须是一些执行副作用。

编辑为WHEREFOR:

我用过的堆叠上下文的(在某种程度上)替代类层次结构。在较低级别的上下文中,所有这些参与者都会共享一些基本行为,然后在添加之后添加的层中的其他行为区分参与者。这是一种“某种”选择,因为演员可能实际上需要改变“类”来回应消息(同时保留自我,以便其他具有这些句柄的演员不需要替换一堆裁判等) 。我希望能够做的就像有条件地呼叫super.apply(Baz),同时在正确的概念层/位置中维护副作用。

回答

1

您可以使用存储特征(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 
} 
+0

hrm,也许。但是,我一定希望保留堆栈的顶部,而不是“不可能”。 – Carl

+0

现在您的堆叠行为有什么用处?你有没有不满? –

+0

Neg - 会编辑Q. – Carl

0

ReceivePartialFunction,你可以使用orElseandThen撰写他们。

+0

我不认为'和那么'对'Receive'会很有用 - 它会产生'Unit'。 'orElse'不包括“在这个块*和*这一个中评估”的情况。 – Carl