2013-04-04 36 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