加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:52:38 所属栏目:安全 来源:网络整理
导读:L.S. 我只是使用Odersky等人的“Scala编程”来学习Scala. 在关于演员的章节中,我遇到了无法解释的行为.更具体地说,当尝试向’self’发送消息时(另请参阅example) 进入Scala shell: scala import scala.actors.Actor._ import scala.actors.Actor._scala sel
L.S.

我只是使用Odersky等人的“Scala编程”来学习Scala.

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

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

解决方法

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

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

object $1 {
  self ! "Hello"
}

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

和$1.self不同于$2.self,而在第二种情况下你有

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读