Debugging Can';t解释在scala shell中执行的示例的行为

Debugging Can';t解释在scala shell中执行的示例的行为,debugging,shell,scala,actor,Debugging,Shell,Scala,Actor,L.S 我只是在用Odersky等人的“Scala编程”学习Scala 在关于演员的一章中,我谈到了我无法解释的行为。更具体地说,当尝试向“self”发送消息时(另请参见) 在Scala shell中输入: scala> import scala.actors.Actor._ import scala.actors.Actor._ scala > self ! "Hello" scala > self.receive { case x => x } 但最后一行没有

L.S

我只是在用Odersky等人的“Scala编程”学习Scala

在关于演员的一章中,我谈到了我无法解释的行为。更具体地说,当尝试向“self”发送消息时(另请参见)

在Scala shell中输入:

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

scala > self.receive { case x => x }
但最后一行没有“返回”预期答案:

resX:Any = hello
需要执行Ctrl-C以使shell返回接受我的输入并返回以下消息:

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作为参与者答案的接收者是一种很好的调试技术

在写这本书的时候,演员只有一种:基于线程的演员。因此,如果对来自同一线程的不同对象调用了
self
,它将返回相同的
Actor
。自从Scala2.8(我认为)以来,这已经不再适用了

shell的工作方式是为每个发送的输入创建匿名类,因此在第一种情况下

object $1 {
  self ! "Hello"
}

object $2 {
  self.receive { case x => x }
}
object $3 {
  self ! "Hello" ; self.receive { case x => x }
}
$1.self
$2.self
不同,而在第二种情况下,您有

object $1 {
  self ! "Hello"
}

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

啊哈,这很有道理!谢谢你@Alexey。