gpt4 book ai didi

scala - [ ] 和 ( ) 之间创建新 Scala 对象的区别

转载 作者:行者123 更新时间:2023-12-04 15:54:22 25 4
gpt4 key购买 nike

只是看看 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 允许您在不声明应用方法的情况下调用应用方法,因此在您的第一个示例中,您可以将其重写为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com