2016-05-08 16 views
4

私はScalaとAkkaの両方が新しく、thisチュートリアルに従っています。私は次のことに出くわして、この構文が正確に何を意味するのか/疑問に思っていますか?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") 

私は//Not sure what this meansとコメント行が何をするかわからないんだけど?これは、パラメータ化された型を与える一般的な特性のようです。 source codeを見ると、traitAbstractPropsに及ぶObjectと定義されています。ただし、AbstractPropsは型パラメータ、つまりAbstractProps[T]で定義されていません。誰かが上の行がどのように機能し、それが何をするのかを説明することができますか

+0

また、 'Props [A]'の亜種を使用している場合、これに注意してください:http://stackoverflow.com/questions/33042105/differences-between-propsnew-a-with-b-and-propsa-with-b – ale64bit

答えて

6

のように書き換えることができ

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

applyメソッドを実装する任意のオブジェクトがnewなしで呼び出すことができ

:あなたは配列を有し、インデックス1の要素をしたいと言いますキーワードを入力すると、 MyObject()が呼び出され、自動的に検索されます。 applyです。

/** 
* 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) 

このapplyは、1種類のパラメータなしの引数を取ります:あなたはPropsためcompanion objectを見れば

は、あなたが定義された次のような方法が表示されます。 T <: Actorは、渡すタイプのTActorに拡張されている必要があることを意味します。 Scalaはオブジェクトの作成方法を知っています。

さらに、Scalaでarity-0を使用するメソッドはすべて括弧を削除することがあります。これはProps[MyActor]()と等価で、Props.apply[MyActor]()に相当するので、Props[MyActor]が実際にコンパイルされているのが見えます。

3

akka.actor.Propsを形質 AbstractPropsもケースクラスとして定義

その延在するオブジェクトとして定義され:

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

これはスカラで共通のパターンであるがコンパニオンオブジェクトを持つクラス。コンパニオンオブジェクトは頻繁にファクトリメソッドを格納しており、実際にあなたの例で呼び出すものがあります。

val props1 = Props[MyActor] 

これは、単にコンパニオンオブジェクトのapply()を呼び出します。引数が必要ない場合はScalaのカッコを省略することができ、applyはオブジェクト/インスタンスで直接呼び出すことのできる特別なメソッドです。最終的にあなたのコードが

Scalaで
val props1 = Props.apply[MyActor]()