2013-04-04 73 views
4

我目前正在學習Scala & Akka併爲其開發測試應用程序。在這種應用中,幾乎所有的參與者記錄未處理的郵件,便於調試:如何在鏈接部分功能時避免「丟失類型」錯誤

import akka.actor._ 

class TestActor extends Actor with ActorLogging { 
    def receive: Receive = { 
    case Some(value) => // do something... 
    case msg => log.debug("Unhandled message: {}.", msg) 
    } 
} 

正如我所說的,幾乎存在於所有的代理商這樣的代碼,我開始考慮將它移入一個特點:

trait LogUnhandled { this: Actor with ActorLogging => 
    def logUnhandled: Receive = { 
    case msg => log.debug("Unhandled message: {}.", msg) 
    } 
} 

後像

class TestActor extends Actor with ActorLogging with LogUnhandled { 
    def receive: Receive = { 
    case Some(value) => // do something... 
    } orElse logUnhandled 
} 

我在想,如果主要是結構性亞型會允許我這樣做或使用它和LogUnhadled#Receive將是不同的類型,但即使在此之前,我已經得到了

error: missing parameter type for expanded function 
The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: ? 

而且現在我想不出如何避免除此以外通過移動第一{...}塊爲單獨的功能:

class TestActor extends Actor with ActorLogging with LogUnhandled { 
    def doReceive: Receive = { 
    case Some(value) => // do something... 
    } 

    def receive: Receive = doReceive orElse logUnhandled 
} 

後者將做,當然,但它是有點「跑題」,並對其造成其他一些副作用,如「想想相應的功能名稱,而不是receive」 ......

所以我想:是否可以通過某種方式聲明(Any) => Unit函數簽名'就位'來避免'缺少類型參數錯誤'?

回答

4
class TestActor extends Actor with ActorLogging with LogUnhandled { 
    def receive = ({ 
    case Some(value) => // do something... 
    }: Receive) orElse logUnhandled 
} 

另請參閱this。 LoggingReceive可讓您執行以下操作:

class A extends Actor { 
    def receive = LoggingReceive { 
     case msg => ... 
    } 
} 

並且所有接受/拒絕的消息都將發佈到調試流。

+0

謝謝!這正是我需要的。通過這種可切換的「LoggingReceive」,它會更好。 – Seigert 2013-04-04 20:43:48