Programming in Scala ch30 (Actor..
时间:2010-09-27 来源:jamesqiu
l 采用不可变消息
l 让消息自说明
def act() {
loop {
react {
case (name: String, actor: Actor) =>
actor ! (name, getIp(name))
}
}
}
// 不易理解,因为传递的是个一般的字符串,很难指出那个actor来响应这个消息
lookerUpper ! ("www.scala-lang.org", self)
// 改为如下,则指出只有react能处理LoopupIP的actor来处理:
case class LookupIP(hostname: String, requester: Actor)
lookerUpper ! LookupIP("www.scala-lang.org", self)
// 完整程序,把请求消息和回应消息进行包装
import actors.Actor._, actors._, java.net._
case class LookupIP(name: String, respondTo: Actor)
case class LookupResult(name: String, address: Option[InetAddress])
def getIp(name: String): Option[InetAddress] = {
try { Some(InetAddress.getByName(name))
} catch { case _: UnknownHostException => None }
}
object NameResolver2 extends Actor {
def act() {
loop {
react {
case LookupIP(name, actor) =>
actor ! LookupResult(name, getIp(name))
}
}
}
}
// 使用
scala>NameResolver2 ! LookupIP("g.cn", self)
scala>self.receiveWithin(0){case LookupResult(n,a)=>println(n,a.get)}
(g.cn,g.cn/203.208.39.104)