看看 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](): Propsdef 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/

10-15 03:48