2017-10-18 3 views
3

스칼라 아크카를보고 다음 객체 초기화 방법의 차이점을 궁금해합니다.새로운 스칼라 객체를 만들기위한 []과() 사이의 차이점

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

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

나는 두 번째, Props(new HelloActor())을 이해할 수 있지만, 첫 번째, Props[HelloActor]은 무엇인가? 나는 그것의 이름을 모른다 그래서 그것을 위해 Google 수 없다.

답변

2

소품은 동반자 개체가있는 사례 클래스입니다. 스칼라 코드에서는 사람들이 객체를 구성하는 두 가지 주요 방법을 볼 수 있습니다. 하나는 클래스에 생성자가 있습니다. 또 다른 주요 방법은 컴패니언 개체에 대해 apply() 메서드를 호출하는 것입니다.

소스 코드 akka.actor.Props을 보면 컴패니언 객체에 4 개의 apply() 메쏘드가 있으며 그 중 2 개가 위의 코드에서 참조하고 있음을 알 수 있습니다. 자신의 서명을 작성 당시에 있습니다

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

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

로 투표 설탕 스칼라 당신이 Props[HelloActor]()으로 그것을 다시 작성할 수 있습니다 첫 번째 예에서되도록이 방법을 적용 진술없이 적용 메서드를 호출 할 수 있습니다 컴파일러는 apply() 메소드를 삽입합니다. 다음에, 메소드에 인수가없는 경우, 괄호를 생략 할 수 있습니다. 그래서 위에서 언급 한대로 전화는 Props[HelloActor]이됩니다.

두 번째 예에서는 두 번째 apply() 메서드를 호출합니다.

실제 HelloActor 클래스가 어떻게 좀 더 복잡해 지는지에 대한 질문과 관련하여. 명시 적으로 정의 된 apply() 메서드는 모두 결국 apply() 메서드를 호출합니다.이 메서드는 사례 클래스가되는 Props의 특성에 따라 생성됩니다. 이 적용은 akka.actor.IndirectActorProducer를 생성하는 Props의 생성자를 호출합니다. 이 클래스에는 액터를 인스턴스화하는 데 사용할 수있는 많은 전략이 있습니다. 간단한 경우에는 리플렉션을 사용하여 배우를 구성합니다.

+1

너무 철저하고 요점. 덕분에 많이 – TrongBang

+0

결국 다른 적용 방법에 의해 호출되는 특수 적용 방법에 대해 더 많이 알 수 있습니까? 그것은 akka에 특정한 무엇인가? 아니면 스칼라의 본질입니까? – TrongBang

+0

특별한 apply() 메소드는 Scala에 포함되어 있으며 클래스에 case 키워드를 추가 할 때 만들어집니다. 따라서 생성하는 모든 사례 클래스에는 생성자와 동일한 매개 변수를 모두 포함하는 암시 적 apply() 메서드가 만들어집니다. – rancidfishbreath

2

스칼라의 대괄호 []generic class의 사용을 나타냅니다. 일반 클래스는 유형을 매개 변수로 사용하는 클래스입니다. 제네릭 클래스의 인스턴스화에서 대괄호 사이의 클래스 이름은 해당 유형 매개 변수에 대한 인수입니다.

따라서 Props 클래스에는 1 개의 일반 매개 변수가 있고 Props[HelloActor] 라인에는 해당 일반 매개 변수에 대한 인수로 HelloActor 유형이 제공됩니다.

+0

** 소품 [HelloActor] ** 객체입니까? 그렇다면 ** system.actorOf() **가이 객체를 사용하여 다른 실제 HelloActor 객체를 초기화하는 방법은 무엇입니까? – TrongBang

관련 문제