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