2011-09-21 30 views
3

下面的代码片段从编程采取斯卡拉'自我'如何在斯卡拉演员中工作?

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 
    } 
} 
} 

首先反应内{}是什么递归调用行为()呢?它看起来像所有的情况下会失败,它会简单地一直到最后什么都不做。

书中

其次,他们使用以下REPL例如

NameResolver ! ("www.scala-lang.org", self) 

哪里“自我”从何而来?我试图在主方法复制此

def main(args: Array[String]) { 
    NameResolver.start() 
    NameResolver ! ("www.scala-lang.org", Actor.self) 
} 

以上不工作

+1

请您详细说明“上述不起作用”? –

回答

2
  1. react的代码被称为只有当一个消息可用。因此,如果在case子句中递归调用act(),则actor将“等待”,直到发送新消息(不阻塞线程)。这是loop的替代方法,当您想要根据收到的内容更改演员的行为时。当你得到"EXIT"时,你停止等待消息。

  2. self应该使用演员每次要使用this

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

  2. Actor.selfreliable way从一个演员的身体内指的是演员的实例(我们建议使用self而不是this,指正确的实例)。在你的情况下,你不是从演员那里调用Actor.self,因此它失败了。