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")
}
這意味着父處理是基本沒用這裏,你可以從模式匹配中扣除。
我想這裏的點始終覺得這些部分功能是如何被合併,因爲一些模式匹配分支可能永遠不會到達。在這種情況下,父處理將永遠不會到達,因爲它基本上是重寫。除此之外,部分功能非常酷!我希望幫助:)