【问题标题】:How to avoid `missing type` error while chaining partial functions链接部分函数时如何避免“缺少类型”错误
【发布时间】:2013-04-04 19:27:45
【问题描述】:

我目前正在研究 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
}

我主要想知道结构子类型是否允许我这样做,或者 TestActor#ReceiveLogUnhadled#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 函数签名“就位”来避免“缺少类型参数错误”?

【问题讨论】:

    标签: scala akka anonymous-function partialfunction


    【解决方案1】:
    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 => ...
       }
    }
    

    所有接受/拒绝的消息都将发布到调试流。

    【讨论】:

    • 谢谢!这正是我所需要的。有了这个可切换的LoggingReceive,效果会更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 2021-03-01
    • 2021-03-31
    • 2011-06-06
    • 2011-11-02
    • 2017-07-16
    • 2014-02-08
    相关资源
    最近更新 更多