在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! 唯一要记住的是,收件的顺序不应该是重要的,因为你不能轻易地预测哪一个是链中的第一个,尽管你可以通过使用可变的哈希而不是一个名单。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |