更新:Props[MyActor] 会在 Akka 中创建 Props 实例吗?



我正在学习Akka(在Scala中),我经常遇到以这种方式创建的Akka演员:

val myActor = system.actorOf(Props[MyActor], "myactor2")

我不明白这一点:我认为Props[MyActor]是一个类/类型,但不是类型Props[MyActor]Props实例。(我不确定我的理解是否正确)。

ActorSystem.actorOf()需要某些特定T的类型为Props[T]的实例。所以我的问题是,为什么不system.actorOf(Props[MyActor](), "myactor2")(附加括号)?

----更新@19th,9月----

我在 Scala REPL 中尝试了这样的 sth:

object CX {
def apply[T]() = new CX
}
class CX
object CX2 {
def apply() = new CX2
}
class CX2

并发现val x2 = CX2属于CX2.type类型,而val x = CX[Int]实际上会创建一个CX实例。

scala> val x = CX[Int]
x: CX = CX@3b51cbf7
scala> val x2 = CX2
x2: CX2.type = CX2$@11314183

这才是Props[T]创作中真正让我感到困惑的地方。

为什么CX不像CX[Int]那样创建CX实例?是否有任何文档或规范对此进行了详细说明?

正如你已经指出的Propscase class不采用类型参数,但是Props的 companion 对象的apply方法提供了一个实用方法:

def apply[T <: Actor]()(implicit arg0: ClassTag[T]): Props

这是您的示例中使用的方法。

为什么不system.actorOf(Props[MyActor](), "myactor2")(附加括号)?

当然,你也可以这样做。当您遵循在参与者的伴随对象中创建props工厂方法的推荐做法时,这就是您实际上所做的。

--9月19日更新 --

我认为你在这里混合了几件事。

一是Props[T]建设。如前所述,它使用隐式ClassTag[T]来了解要构建的类型。有关TypeTagClassTag的更多信息,请点击此处。因此,您添加的CXCX2示例实际上与Props[T]方案并不相同。

其次,对于你的问题来说,也是最重要的,CX2对象上的apply有括号,但你没有括号就调用它。虽然这将编译(但它会给你一个警告),但它会使你突出显示的混乱场景。这里的提示是val x2 = CX2是类型CX2.type- 这是CX2对象的类型,而不是类的类型。 正在发生的事情是,您有一个没有括号的def apply(),也没有与CX2对象实例本身的其他区别因素。因此,当您不带括号调用它时,编译器会像"我可以引用对象的唯一方法是CX2,而apply可以由CX2CX2()引用。然后,我将假设CX2指的是对象,CX2()是指apply"。若要验证是否正在发生,可以尝试val y = CX2()并注意它将具有所需的类型。

希望这能澄清一些情况。

Props的配套对象有一个零参数应用方法,该方法采用类型参数并为该类型创建默认的 Props 对象。Props[MyActor]Props[MyActor]()在期望值的上下文中是一回事(例如,在调用system.actorOf时)。

最新更新