2017-10-18 35 views
3

只看Scala Akka並想知道以下對象初始化方法之間有什麼區別。[]和()之間的區別創建新的Scala對象

system.actorOf(Props[HelloActor], name = "helloactor") 

system.actorOf(Props(new HelloActor("Fred")), name = "helloactor") 

我可以理解,第二個,Props(new HelloActor()),但什麼是第一位的,Props[HelloActor]?我不知道它的名字,所以不能谷歌。

回答

2

Props是一個包含伴侶對象的案例類。在Scala代碼中,您將看到人們構建對象的兩種主要方式。一個是在一個類上的構造函數。另一個主要方法是在伴侶對象上調用apply()方法。

如果您查看akka.actor.Props的源代碼,您會發現伴侶對象有四個apply()方法,其中兩個在上面的代碼中引用。在撰寫他們的簽名時間爲:

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

def apply[T <: Actor: ClassTag](creator: ⇒ T): Props

樂於助人糖斯卡拉可調用的應用方法,無需說明的適用方法,以便在你的第一個例子中,你可以重寫爲Props[HelloActor]()和編譯器會爲您插入apply()方法。接下來,如果一個方法沒有參數,你可以省略括號。正如你在上面指出的那樣,這個呼叫變成Props[HelloActor]

你的第二個例子調用第二個apply()方法。

至於你的問題,真正的HelloActor類是如何實例化,有點複雜。所有明確定義的apply()方法最終都會調用一個特殊的方法,該方法是由作爲案例類的Props的本質生成的。這適用於在創建akka.actor.IndirectActorProducer的Props上調用構造函數。這個類包含許多可用於實例化actor的策略。在你的簡單情況下,它最終使用反射來構建你的演員。

+1

這麼徹底和重點。非常感謝 – TrongBang

+0

我可以瞭解更多關於最終由其他應用方法調用的特殊應用方法。這是特定於阿卡嗎?或者它是scala的本質? – TrongBang

+0

特殊的apply()方法是Scala的一部分,在將case關鍵字添加到您的類時創建。因此,您創建的任何案例類都將創建一個隱式的apply()方法,該方法的所有參數都與您的構造方法相同。 – rancidfishbreath

2

Scala中的方括號[]表示使用generic class。泛型類是以類型作爲參數的類。泛型類的實例化中的括號之間的類名稱是該類型參數的參數。

所以在你的情況下,Props類有1個通用參數,並且行Props[HelloActor]提供類型HelloActor作爲該通用參數的參數。

+0

所以是**道具[HelloActor] **一個對象?如果是,** system.actorOf()**如何使用該對象來初始化另一個實際的HelloActor對象? – TrongBang

相關問題