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

在Akka接收方法中组合Scala中的特征行为

发布时间:2020-12-16 09:37:47 所属栏目:安全 来源:网络整理
导读:考虑这两个特点: trait Poked extends Actor { override def receive = { case Poke(port,x) = ReceivePoke(port,x) } def ReceivePoke(port: String,x: Any)}trait Peeked extends Actor { override def receive = { case Peek(port) = ReceivePeek(port)
考虑这两个特点:

trait Poked extends Actor {
  override def receive = {
    case Poke(port,x) => ReceivePoke(port,x)
  }

  def ReceivePoke(port: String,x: Any)
}

trait Peeked extends Actor {
  override def receive = {
    case Peek(port) => ReceivePeek(port)
  }

  def ReceivePeek(port: String)
}

现在考虑我可以创建一个实现两个特征的新的Actor:

val peekedpoked = actorRef(new Actor extends Poked with Peeked)

如何组合接收处理程序?即接收者应该像以下代码一样,虽然“自动生成”(即,所有特征应该组成):

def receive = (Poked.receive: Receive) orElse (Peeked.receive: Receive) orElse ...

解决方法

您可以使用超级[T]引用特定超级类/特征的成员。

例如:

trait IntActor extends Actor {
    def receive = {
        case i: Int => println("Int!")
    }
}

trait StringActor extends Actor {
    def receive = {
        case s: String => println("String!")
    }
}

class IntOrString extends Actor with IntActor with StringActor {
    override def receive = super[IntActor].receive orElse super[StringActor].receive
}

val a = actorOf[IntOrString].start
a ! 5 //prints Int!
a ! "Hello" //prints String!

编辑:

为了回应雨果的评论,这里有一个解决方案,可以让您组合混音,而无需手动将收音一起接收。本质上它涉及具有可变列表[Receive]的基本特征,并且每个混合特征调用一个方法来将其自己的接收添加到列表中。

trait ComposableActor extends Actor {
  private var receives: List[Receive] = List()
  protected def registerReceive(receive: Receive) {
    receives = receive :: receives
  }

  def receive = receives reduce {_ orElse _}
}

trait IntActor extends ComposableActor {
  registerReceive {
    case i: Int => println("Int!")
  }
}

trait StringActor extends ComposableActor {
  registerReceive {
    case s: String => println("String!")
  }
}

val a = actorOf(new ComposableActor with IntActor with StringActor).start
a ! 5 //prints Int!
a ! "test" //prints String!

唯一要记住的是,收件的顺序不应该是重要的,因为你不能轻易地预测哪一个是链中的第一个,尽管你可以通过使用可变的哈希而不是一个名单。

(编辑:李大同)

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

    推荐文章
      热点阅读