2013-01-22 4 views
1

일부 자습서로 배우기 나는 (String-) 메시지를 액터로 보내고 액터가 콘솔에 출력으로 응답하는 간단한 스칼라 액터 예제를 얻으려고했습니다. 내 코드는 다음과 같습니다스칼라 액터 예 : 예상 유형 :?

import scala.io.Source 
import scala.actors.Actor 

object ProtTest { 

    class testActor extends Actor { 
    def receive = { 
     case "you" => Console.println("Hello you!") 
     case _ => Console.println ("Hello ???") 
    } 
    } 

    val t = new testActor 
    t ! "you" 
} 

불행하게도, 난 "= {데프받을"지금은 꽤 오랫동안 그것에 갇혀에 다음과 같은 오류 메시지가 :

Missing parameter type for expanded function 
The argument types of an anonymous function must be fully known (SLS 8.5) 
Expected Type was: ? 

난 정말 아무 생각이 무엇인지 오류 메시지의 물음표는 어떻게 작동할까요?

+1

기존 스칼라 표준 라이브러리 액터를 사용할 이유가 거의 없습니다. Akka 액터 (스칼라 2.10 이후의 새로운 표준 라이브러리 액터)를 사용하십시오. 아카 (Akka)의 배우들은 모든면에서 오래된 것들보다 개선되어 있습니다. –

답변

5

배우 구현에 대해 약간 혼란스러운 것처럼 보입니다. testActor 코드는 Akka 액터에서 유효하지만 스칼라 액터 라이브러리를 사용하고 있습니다.

Akka 및 scala.actors는 액터 모델의 두 가지 고유 한 구현입니다. 스칼라 액터가 원래 구현 이었지만 Akka는 이제 더 많이 보급되었고 (훨씬 뛰어난 IMO) 스칼라 2.10에서는 스칼라와 함께 번들로 제공되는 표준 구현체입니다 (scala.actors는 있지만 2.10에서는 더 이상 사용되지 않습니다).

실제로 제대로 스칼라 배우를 구현하는 방법을 알고 있지만 여기 Akka에서 실행하는 배우를 얻는 방법입니다하지 않습니다

import akka.actor._ 

object ProtTest { 

    class testActor extends Actor { 
    def receive = { 
     case "you" => Console.println("Hello you!") 
     case _ => Console.println ("Hello ???") 
    } 

    override def postStop() { 
     context.system.shutdown 
    } 
    } 

    val system = ActorSystem("test") 
    val t = system.actorOf(Props[testActor]) 
    t ! "you" 
    t ! PoisonPill 
    system.awaitTermination 

} 

당신이 볼 수 있듯이이, Akka 조금 보일러를 필요에 적절하게 설정 및 액터 시스템을 종료하지만 주 행위자 코드는 변경되지 않습니다. postStop 메서드는 액터가 종료 된 후에 호출됩니다. 액터가 PoisonPill 메시지를받을 때 발생합니다.

+0

안녕하세요, 맞아요. 그 두 종류의 구현이 조금 섞여있는 것 같아요. 나는 Akka Documentation을 읽고 Scala Actors에 관한 튜토리얼을 섞어서 읽었습니다. 내 실수를 지적 해 주셔서 감사합니다! – AvantiC

3

receive은 구현하는 방법이 아닙니다.

class testActor extends Actor { 
    def act = { 
     while (true) { 
     receive { 
      case "you" => Console.println("Hello you!") 
      case _ => Console.println ("Hello ???") 
     } 
     } 
    } 
    } 

그래서 receive 당신이 전화하는 방법입니다 : 당신은 당신이receive호출하는 경우에, act를 구현해야합니다. 전달한 인수는 case 절을 ​​포함하는 {..}의 코드 블록입니다. 이 인수의 유형은 일부 기능입니다 - 귀하의 경우, (어떤 println 반환 void의 스칼라 버전) Unit에 (스칼라는 "당신이" 문자열이기 때문에 추론) String에서 함수.

(부분 기능이 case 문장과 얼마나 유사한 지에 대한 좋은 설명은 Twitters 'Scala School을 참조하십시오).

컴파일 오류 메시지는 기본 스칼라 개념을 이해하면 쉽게 이해할 수 있습니다.이 경우 익명의 함수와 _ 속기가 필요한 동작을 알고 있습니다.

또한 메시지를 수신하려면 액터 인스턴스를 t.start으로 시작해야합니다.

아직 사용되지 않지만 대부분의 사람들 (다른 답변이 지적한대로)은 Akka 배우를 선호합니다. 스칼라 2.10 이후로, scala.actors.Actor은 Akka 액터를 위해 더 이상 사용되지 않습니다.

(당신이 원하는 경우 측면 참고로, 그 코드는 또한 하나 App 확장으로 ProtTest를 선언 또는 main 메소드와 클래스 (또는 개체)에 호출 t ! "you"를 이동해야 작동합니다)
0

나는 스카라의 배우 시스템보다 Akka를 더 많이 사용하지만 ... here's a short tutorial; 당신은 예제에서 receive 블록이 def act() 메서드 안에있는 루프 (예 : while (true) {...}) 안에 있어야한다는 것을 알 수 있습니다.