以下代码段取自Scala中的Programming
import actors.Actor
object NameResolver extends Actor {
import java.net.{InetAddress, UnknownHostException}
def act() {
react {
case (name: String, actor: Actor) =>
actor ! getIp(name)
act()
case "EXIT" =>
println("Name resolver exiting.")
// quit
case msg =>
println("Unhandled message: " + msg)
act()
}
}
def getIp(name: String): Option[InetAddress] = {
try {
Some(InetAddress.getByName(name))
} catch {
case _: UnknownHostException => None
}
}
}
首先在react {}内对act()的递归调用有什么作用?看起来所有的情况都会失败,它会一直无所事事地落到最后。
其次在本书中,他们使用以下REPL示例
NameResolver ! ("www.scala-lang.org", self)
'self'来自哪里?我试图在主方法
中复制它 def main(args: Array[String]) {
NameResolver.start()
NameResolver ! ("www.scala-lang.org", Actor.self)
}
以上不起作用
答案 0 :(得分:3)
act()
以递归方式运行,除非您发送EXIT
消息。对于既不匹配EXIT
也不(name: String, actor: Actor)
的任何其他消息,将使用case msg
。换句话说,case msg
是一种处理所有不匹配消息的通用处理程序。
Actor.self
是一个reliable way来引用演员身体中的演员实例(建议使用self
而不是{{ 1}},引用正确的实例)。在你的情况下,你不是从一个演员那里调用this
,因此它失败了。
答案 1 :(得分:2)
仅当新消息可用时才会调用react
内的代码。因此,如果在act()
子句中调用递归case
,则actor将“等待”直到发送新消息(不阻塞线程)。当您想根据收到的内容更改actor的行为时,它是loop
的替代。在这里,当您获得"EXIT"
时,您将停止等待消息。
self
时, this
都应该在内部中使用。