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的答案的接收者是一种很好的调试技术.
在写这本书的时候,只有一种演员:基于线程的演员.因此,如果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)