无法解释在scala shell中执行的示例的行为

nan*_*ous 4 debugging shell scala actor

LS

我只是在Odersky等人的"Scala编程"中学习Scala.

在关于演员的章节中,我遇到了无法解释的行为.更具体地说,当尝试向'self'发送消息时(另请参见示例)

进入Scala shell:

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

scala > self.receive { case x => x }
Run Code Online (Sandbox Code Playgroud)

但最后一行没有"回归"预期答案:

resX:Any = hello
Run Code Online (Sandbox Code Playgroud)

需要执行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}
Run Code Online (Sandbox Code Playgroud)

但以下实际上有效:

self ! "Hello" ; self.receive { case x => x }
Run Code Online (Sandbox Code Playgroud)

我的问题是:

发生了什么?为什么第一个例子不起作用,第二个例子不起作用?!?我想更好地理解shell的行为,因为本书的作者声称使用self作为actor的答案的接收者是一种很好的调试技术.

Ale*_*nov 9

在写这本书的时候,只有一种演员:基于线程的演员.因此,如果self从同一个线程调用不同的对象,它返回相同的Actor.自从Scala 2.8(我认为)这个不再成立.

shell的工作方式是为每个发送的输入创建一个匿名类,所以在第一种情况下你就有了

object $1 {
  self ! "Hello"
}

object $2 {
  self.receive { case x => x }
}
Run Code Online (Sandbox Code Playgroud)

并且与第二种情况$1.self不同$2.self

object $3 {
  self ! "Hello" ; self.receive { case x => x }
}
Run Code Online (Sandbox Code Playgroud)