2014-01-29 26 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