Scala 作为系统 actorRef 包装器

Scala Akka system actorRef wrapper

如何为

定义包装器function/classaddActorToSystem()
trait Stage extends Actor
class Stage1(i:Int) extends Stage
class Stage2(i:Int) extends Stage

implicit val system = ActorSystem("mySystem")

而不是调用

system.actorOf(Props(new Stage1(123)), "myStage1")

以下无效

You cannot create an instance of [Stage2] explicitly using the constructor (new)

def addActorToSystem(act: Stage, i: Int)(name: String)(implicit sys: ActorSystem) = {
  sys.actorOf(Props(act(i)), name)
}

也许这样的事情会对你有所帮助:

def addActorToSystem[T <: Stage](act: Class[T], i: Int)(name: String)(implicit sys: ActorSystem) = {
  sys.actorOf(Props(act, i), name)
}

用法如下:

val s1 = addActorToSystem(classOf[Stage1], 1)("s1")
val s2 = addActorToSystem(classOf[Stage2], 2)("s2")

不允许在未定义 ActorContext 的情况下创建 actor(通过使用构造函数)。

这在 Props 中起作用的唯一原因是构造函数调用被作为 by-name 参数处理,因此它的评估被推迟了