“自我”如何在Scala演员中发挥作用?

时间:2011-09-21 01:41:14

标签: scala actor

以下代码段取自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)
 }

以上不起作用

2 个答案:

答案 0 :(得分:3)

  1. act()以递归方式运行,除非您发送EXIT消息。对于既不匹配EXIT也不(name: String, actor: Actor)的任何其他消息,将使用case msg。换句话说,case msg是一种处理所有不匹配消息的通用处理程序。

  2. Actor.self是一个reliable way来引用演员身体中的演员实例(建议使用self而不是{{ 1}},引用正确的实例)。在你的情况下,你不是从一个演员那里调用this,因此它失败了。

答案 1 :(得分:2)

  1. 仅当消息可用时才会调用react内的代码。因此,如果在act()子句中调用递归case,则actor将“等待”直到发送新消息(不阻塞线程)。当您想根据收到的内容更改actor的行为时,它是loop的替代。在这里,当您获得"EXIT"时,您将停止等待消息。

  2. 每次要使用self时,
  3. this都应该在内部中使用。