2011-09-21 4 views
3

다음 코드는 스칼라스칼라 액터에서 '자아'는 어떻게 작동합니까?

에서 프로그래밍에서 가져
import actors.Actor 

object NameResolver extends Actor { 

import java.net.{InetAddress, UnknownHostException} 


def act() { 
    react { 
    case (name: String, actor: Actor) => 
     actor ! getIp(name) 
     act() 
    case "EXIT" => 
     println("Name resolver exiting.") 
    // quit 
    case msg => 
     println("Unhandled message: " + msg) 
     act() 
    } 
} 

def getIp(name: String): Option[InetAddress] = { 
    try { 
    Some(InetAddress.getByName(name)) 
    } catch { 
    case _: UnknownHostException => None 
    } 
} 
} 

가 먼저 내 반응 {} 재귀 호출이 무엇을 행동 않습니다()는 무엇입니까? 모든 경우가 실패하고 결국 아무것도하지 않고 끝까지 빠져 나가는 것처럼 보입니다. 이 책에서 두 번째로

, 그들은

NameResolver ! ("www.scala-lang.org", self) 

경우 '자기'에서 오는가 다음 REPL 예를 사용할 수 있습니까? 나는 당신이 EXIT 메시지를 전송하지 않는 한

def main(args: Array[String]) { 
    NameResolver.start() 
    NameResolver ! ("www.scala-lang.org", Actor.self) 
} 

가 위, 재귀

+1

"The above does not work"에 대해 자세히 설명해 주시겠습니까? –

답변

2
  1. react 내부의 코드는 메시지를 사용할 수있는 경우에만 호출된다. 따라서 case 절 안에 반복적으로 act()을 호출하면 새 메시지가 전송 될 때까지 (스레드를 차단하지 않고) 액터가 "대기"합니다. 액터의 동작을 수신 한대로 변경하려는 경우 loop의 대안입니다. 여기서 "EXIT"을 얻으면 메시지 대기를 멈 춥니 다. 당신이 this를 사용하려면 배우 매번 내부

  2. self

    사용하도록되어.

3
  1. act() 실행 작동하지 않는 주된 방법이를 복제하는 것을 시도했다. EXIT이나 (name: String, actor: Actor)과 일치하지 않는 다른 메시지의 경우 case msg이 사용됩니다. 즉 case msg은 일치하지 않는 모든 메시지를 처리하는 일종의 일반 처리기입니다.

  2. Actor.self 배우의 몸 내에서 배우 인스턴스 를 참조하는 reliable way이다 (바로 인스턴스를 참조하는 self 대신 this를 사용하는 것이 좋습니다). 귀하의 경우에는 배우가 아닌 Actor.self으로 전화하고 있으므로 실패합니다.

관련 문제