2011-12-14 88 views
4

L.S.無法解釋在scala shell中執行的示例的行爲

我只是在使用Odersky等人的「Programming in Scala」學習Scala。

在關於演員的章節中,我遇到了無法解釋的行爲。更具體地說試圖將消息發送到「自我」時(見example

進入Scala的外殼:

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

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

但最後一行不與預期的答案「迴歸」:

resX:Any = hello 

在需要做Ctrl-C來獲得背殼接受我的輸入和返回的信息是:

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 } 

我的問題是:

發生了什麼事?爲什麼第一個例子不工作,第二個例子呢?!? 我想理解shell的行爲,因爲本書的作者聲稱使用self作爲actor的答案的接收者是一個很好的調試技術。

回答

9

在寫這本書的時候,只有一種演員:基於線程的演員。因此,如果在同一線程的不同對象上調用self,則它將返回相同的Actor。由於斯卡拉2.8(我認爲)這不再成立。

的方式外殼的作品是對每個發送的輸入創建匿名類,所以在第一種情況下,你有

object $1 { 
    self ! "Hello" 
} 

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

$1.self$2.self不同,而在第二種情況下,你有

object $3 { 
    self ! "Hello" ; self.receive { case x => x } 
} 
+0

啊哈,這很合理!謝謝@亞歷克西。 – nanitous 2011-12-14 13:16:30