gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:20:53 27 4
gpt4 key购买 nike

L.S.

我正在使用 Odersky 等人的“Scala 编程”来学习 Scala。

在关于 Actor 的章节中,我遇到了无法解释的行为。更具体地说,当尝试向“自己”发送消息时(另请参阅 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 作为参与者答案的接收者是一种很好的调试技术。

最佳答案

在本书撰写时,只有一种参与者:基于线程的参与者。因此,如果在同一线程的不同对象上调用 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 }
}

关于debugging - 无法解释在 scala shell 中执行的示例的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8503885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com