2016-05-08 3 views
4

Ich bin neu in Scala und Akka und habe this Tutorial gefolgt. Ich bin auf folgendes gestoßen und habe mich gefragt, was genau diese Syntax bedeutet?Scala/Akka Syntax

import akka.actor.Props 

val props1 = Props[MyActor] //Not sure what this means??? 
val props2 = Props(new ActorWithArgs("arg")) // careful, see below 
val props3 = Props(classOf[ActorWithArgs], "arg") 

Ich bin nicht sicher, was die mit //Not sure what this means kommentierte Linie tut? Es scheint wie eine generische Eigenschaft, die einen parametrisierten Typ gibt. Wenn ich mir die source code anschaue, ist akka.actor.Props als Object definiert, die die traitAbstractProps verlängert. AbstractProps ist jedoch nicht mit einem Typparameter definiert, d. H. AbstractProps[T]. Kann jemand erklären, wie das funktioniert und was es macht?

+0

Beachten Sie auch: http://stackoverflow.com/questions/33042105/differences-between-propsnew-a-with-b-and-props-a-with-b bei der Verwendung von 'Props [A]' Variante. – ale64bit

Antwort

6

In Scala neu geschrieben werden, jedes Objekt, das eine apply Methode implementiert, kann ohne die new aufgerufen werden Stichwort, einfach durch den Aufruf MyObject(), die automatisch nach ihr suchen wird apply.

Wenn man sich die companion object für Props anschauen, werden Sie die folgende Methode siehe definiert:

/** 
* Scala API: Returns a Props that has default values except for "creator" 
* which will be a function that creates an instance 
* of the supplied type using the default constructor. 
*/ 
def apply[T <: Actor: ClassTag](): Props = 
    apply(defaultDeploy, implicitly[ClassTag[T]].runtimeClass, List.empty) 

Diese apply nimmt einen Typ Parameter und keine Argumente. T <: Actor bedeutet, dass T, der Typ, den Sie übergeben, muss Actor erweitern. So weiß Scala, wie man das Objekt erstellt.

Darüber hinaus kann jede Methode mit Arity-0 in Scala ihre Klammern löschen. So sehen Sie Props[MyActor] tatsächlich kompilieren, wie es Props[MyActor]() entspricht, was Props.apply[MyActor]() entspricht.

3

akka.actor.Props als ein Objekt definiert, das das Merkmal AbstractProps

Sein auch als Fall Klasse definiert erstreckt:

final case class Props(deploy: Deploy, clazz: Class[_], args: immutable.Seq[Any]) 

Dies ist ein gemeinsames Muster in Scala eine Klasse mit einem Begleitobjekt. Das Begleitobjekt enthält häufig Factory-Methoden, und das ist es, was Sie in Ihrem Beispiel tatsächlich aufrufen.

val props1 = Props[MyActor] 

Dies ruft einfach apply() des Companion-Objekts. Sie können die Klammern in Scala weglassen, wenn keine Argumente erforderlich sind, und apply ist eine spezielle Methode, die direkt auf dem Objekt/der Instanz aufgerufen werden kann. Angenommen, Sie haben eine Sequenz, und wollen das Element am Index 1:

val s = Seq("one", "two", "three") 
// These two are equivalent 
s(1) // -> "two" 
s.apply(1) // -> "two" 

Letztlich kann der Code als

val props1 = Props.apply[MyActor]()