Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:如何扩展Akka演员?_Scala_Akka_Actor - Fatal编程技术网

Scala:如何扩展Akka演员?

Scala:如何扩展Akka演员?,scala,akka,actor,Scala,Akka,Actor,我写了一个阿克卡基地的演员,可以处理一些常见的信息。我希望通过扩展基本角色(而不是通过基本角色的组合),在子角色中重用这个基本行为 我在前面的问题中看到了几种方法。它们都是有效的,但也可以改进: 及 为了使实现更简洁,我正在尝试实现以下目标: 定义子参与者时,我尝试只扩展基本参与者(而不是同时扩展actor和sub-actor)。但是,我无法强制编译器执行此操作 我还尝试不重命名receivepartial函数,因为这是一种约定 以下是我的实现示例: //This is the base

我写了一个阿克卡基地的演员,可以处理一些常见的信息。我希望通过扩展基本角色(而不是通过基本角色的组合),在子角色中重用这个基本行为

我在前面的问题中看到了几种方法。它们都是有效的,但也可以改进:

为了使实现更简洁,我正在尝试实现以下目标:

  • 定义子参与者时,我尝试只扩展基本参与者(而不是同时扩展
    actor
    sub-actor
    )。但是,我无法强制编译器执行此操作
  • 我还尝试不重命名
    receive
    partial函数,因为这是一种约定
以下是我的实现示例:

//This is the base-actor that implements the common behavior

trait BetterActor extends Actor {

  abstract override def receive = {
    super.receive orElse { case _ => println("Missing pattern!") }
  }
}

//This is the actor that implements the additional behavior.
//I actually wanted to extend BetterActor. It was not possible.

class MyActor extends Actor {

  def receive = {
    case i: Int =>
      println(s"Yay!!! Got $i")
  }
}
//1.

val myBetterActor = system.actorOf(Props(new MyActor with BetterActor), "myBetterActor")

//2.

class MyBetterActor extends MyActor with BetterActor
val myBetterActor = system.actorOf(Props[MyBetterActor], "myBetterActor")
myBetterActor ! 2
myBetterActor ! "a"
这里有两种可选方法,我可以创建子参与者的实例,它结合了常见行为和其他行为:

//This is the base-actor that implements the common behavior

trait BetterActor extends Actor {

  abstract override def receive = {
    super.receive orElse { case _ => println("Missing pattern!") }
  }
}

//This is the actor that implements the additional behavior.
//I actually wanted to extend BetterActor. It was not possible.

class MyActor extends Actor {

  def receive = {
    case i: Int =>
      println(s"Yay!!! Got $i")
  }
}
//1.

val myBetterActor = system.actorOf(Props(new MyActor with BetterActor), "myBetterActor")

//2.

class MyBetterActor extends MyActor with BetterActor
val myBetterActor = system.actorOf(Props[MyBetterActor], "myBetterActor")
myBetterActor ! 2
myBetterActor ! "a"
最后,我可以通过以下方式调用子参与者:

//This is the base-actor that implements the common behavior

trait BetterActor extends Actor {

  abstract override def receive = {
    super.receive orElse { case _ => println("Missing pattern!") }
  }
}

//This is the actor that implements the additional behavior.
//I actually wanted to extend BetterActor. It was not possible.

class MyActor extends Actor {

  def receive = {
    case i: Int =>
      println(s"Yay!!! Got $i")
  }
}
//1.

val myBetterActor = system.actorOf(Props(new MyActor with BetterActor), "myBetterActor")

//2.

class MyBetterActor extends MyActor with BetterActor
val myBetterActor = system.actorOf(Props[MyBetterActor], "myBetterActor")
myBetterActor ! 2
myBetterActor ! "a"
我的实现存在问题:

//This is the base-actor that implements the common behavior

trait BetterActor extends Actor {

  abstract override def receive = {
    super.receive orElse { case _ => println("Missing pattern!") }
  }
}

//This is the actor that implements the additional behavior.
//I actually wanted to extend BetterActor. It was not possible.

class MyActor extends Actor {

  def receive = {
    case i: Int =>
      println(s"Yay!!! Got $i")
  }
}
//1.

val myBetterActor = system.actorOf(Props(new MyActor with BetterActor), "myBetterActor")

//2.

class MyBetterActor extends MyActor with BetterActor
val myBetterActor = system.actorOf(Props[MyBetterActor], "myBetterActor")
myBetterActor ! 2
myBetterActor ! "a"
当我创建子actor的实例时,只有这样,我才能直接(1)或通过定义一个新类来混合基本actor

正如我之前所说的,当我定义子角色时,我更喜欢混合基本角色。当我尝试创建子参与者的实例时,情况就不是这样了


p.S.令人着迷的是,这个框架的设计者并不认为有必要使这个通用需求易于实现。

我想只要你不想用BetterActor覆盖行为,你就可以尝试这样的方法:

trait BetterActor extends Actor {
  override def unhandled(message: Any): Unit = message match {
    case e: CommonMessage => println("COMMON!")
    case e => super.unhandled(e)
  }
}

class MyActor extends BetterActor {
  override def receive = {
    case i: Int => println(s"Yay!!! Got $i")
  }
}

此框架的设计者已经在
Actor
中创建了
未处理的
方法-您只需重写它就足够了it@ghik我不明白你的一行程序。它能编译吗?我想你的意思是
未处理(message:Any):Unit={message match{…}
也不需要
覆盖
def receive
。另外,正如您所说,
receive
将覆盖基本actor中未处理的
。这样做是有道理的。这是一个很好的解决办法。谢谢你。@rapt-oops,我太笨了。是的,关于那场比赛你是对的。我将编辑答案以反映这一点。