看看 Scala Akka 并想知道以下对象初始化方法之间有什么区别。
system.actorOf(Props[HelloActor], name = "helloactor")
和
system.actorOf(Props(new HelloActor("Fred")), name = "helloactor")
我可以理解第二个
Props(new HelloActor())
,但第一个 Props[HelloActor]
是什么?我不知道它的名字,所以不能谷歌搜索。 最佳答案
Props 是一个带有伴生对象的案例类。在 Scala 代码中,您将看到人们构造对象的两种主要方式。一种是在类上使用构造函数。另一种主要方法是在伴随对象上调用 apply()
方法。
如果您查看 akka.actor.Props
的源代码,您会注意到伴随对象有四个 apply()
方法,您在上面的代码中引用了其中两个方法。在撰写本文时,他们的签名是:def apply[T <: Actor: ClassTag](): Props
def apply[T <: Actor: ClassTag](creator: ⇒ T): Props
作为有用的糖,Scala 允许您在不声明 apply 方法的情况下调用 apply 方法,因此在您的第一个示例中,您可以将其重写为 Props[HelloActor]()
并且编译器为您插入 apply()
方法。接下来,如果一个方法没有参数,您可以省略括号。所以调用变成了 Props[HelloActor]
,正如你上面指出的那样。
您的第二个示例调用第二个 apply()
方法。
至于您关于如何实例化真正的 HelloActor 类的问题,这有点复杂。所有显式定义的 apply()
方法最终都会调用一个特殊的 apply()
方法,该方法是由 Props 作为案例类的性质生成的。这个 apply 调用 Props 上的构造函数,它创建了一个 akka.actor.IndirectActorProducer。该类包含许多可用于实例化actor 的策略。在您的简单情况下,它最终使用反射来构建您的 Actor 。
关于scala - [ ] 和 ( ) 创建新 Scala 对象的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46820483/