2011-12-14 3 views
4

L.S.스칼라 셸에서 실행 된 예제의 동작을 설명 할 수 없습니다.

저는 Odersky 외의 "Programming in Scala"를 사용하여 스칼라를 배웠습니다.

내가 배우에게 연기 한 장에서 나는 설명 할 수 없다. '자기'에 메시지를 보내려고 할 때 구체적 스칼라 쉘에서 입력

(또한 example 참조) :

scala> import scala.actors.Actor._ 
import scala.actors.Actor._ 
scala > self ! "Hello" 

scala > self.receive { case x => x } 

그러나 마지막 줄 않는 것으로 대답하지 '복귀'

내 입력을 받아들이는 다시 쉘을 얻기 위해 Ctrl-C를을하고 필요에
resX:Any = hello 

메시지를 반환 :

Execution interrupted by signal. 

scala> self.receive {case x => x} 
// She's gone rogue, captain! Have to take her out! 
// Calling Thread.stop on runaway Thread[Thread-54,5,main] with offending code: 
// scala> self.receive {case x => x} 
는하지만 실제로 작동 다음

:

self ! "Hello" ; self.receive { case x => x } 

내 질문은 : 무슨 일 이죠

? 첫 번째 예제가 작동하지 않고 두 번째 예제가 작동하지 않는 이유는 무엇입니까? 필자는 배우의 답변을받는 사람으로 self를 사용하는 것이 멋진 디버깅 기술이라고 주장하면서 책의 저자가 조금 더 잘 이해하고 싶습니다.

답변

9

이 책이 쓰여질 당시에는 스레드 기반 액터가 한 종류 만있었습니다. 따라서 self이 동일한 스레드의 다른 객체에서 호출 된 경우 동일한 Actor을 반환했습니다. 스칼라 2.8 이후 (나는 생각한다) 더 이상이 것이 없다.

방법 쉘 작품

는 첫 번째 경우에 두 번째 경우에 당신이

object $3 { 
    self ! "Hello" ; self.receive { case x => x } 
} 
있는 동안

object $1 { 
    self ! "Hello" 
} 

object $2 { 
    self.receive { case x => x } 
} 

$1.self는, $2.self 다른 그래서 각각의 전송 입력 익명 클래스를 만드는 것입니다

+0

아하, 이거 말이야! 감사합니다. @Alexey. – nanitous

관련 문제