2017-02-28 17 views

回答

8

receive功能是PartialFunction[Any, Unit],所以我們可以在我們的優勢中使用它。部分功能提供了一些您可以使用的有用操作符,例如PartialFunction#orElse

這意味着你可以在父演員中定義一個PartialFunction[Any, Unit]然後在另一個子演員中定義接收。讓我們看看一些代碼!

abstract class Parent extends Actor { 
    def commonReceive: Receive = { 
    case CommonHandledMessage => 
     println("common handling") 
    case Message => 
     println("parent handling") 
    } 
} 

class Child extends Actor { 
    override val receive: Receive = specializedReceive orElse commonReceive 

    def specializedReceive: Receive = { 
    case Message => 
     println("child handling") 
    } 
} 

然而,你應該小心你結合這些部分函數的方式,因爲你可能會驚訝的結果。當你使用orElse組合器時,部分函數基本上相互疊加。所以,你可以想像我們上面定義的receive方法轉變成類似:

override val receive: Receive = { 
    case Message => 
    println("child handling") 
    case CommonHandledMessage => 
    println("common handling") 
    case Message => 
    println("parent handling") 
} 

這意味着父處理是基本沒用這裏,你可以從模式匹配中扣除。


我想這裏的點始終覺得這些部分功能是如何被合併,因爲一些模式匹配分支可能永遠不會到達。在這種情況下,父處理將永遠不會到達,因爲它基本上是重寫。除此之外,部分功能非常酷!我希望幫助:)

相關問題