加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 链接部分函数时如何避免“缺少类型”错误

发布时间:2020-12-16 10:02:51 所属栏目:安全 来源:网络整理
导读:我正在学习 Scala Akka并为它开发测试应用程序.在这个应用程序中,几乎所有actor都记录未处理的消息以便于调试: import akka.actor._class TestActor extends Actor with ActorLogging { def receive: Receive = { case Some(value) = // do something... ca
我正在学习 Scala& Akka并为它开发测试应用程序.在这个应用程序中,几乎所有actor都记录未处理的消息以便于调试:

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 #Rece和LogUnhadled #Rece是不同的类型,但即使在此之前我已经有了

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
}

当然,后者会做,但它有点“错过了重点”并造成一些其他的副作用,比如’考虑适当的功能名而不是接收’……

所以我想知道:是否可以通过某种方式声明(Any)=>来避免“缺少类型参数错误”.单位功能签名’到位’?

解决方法

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 => ...
   }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读