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
函數簽名'就位'來避免'缺少類型參數錯誤'?
謝謝!這正是我需要的。通過這種可切換的「LoggingReceive」,它會更好。 – Seigert 2013-04-04 20:43:48