2011-09-21 49 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,因此它失敗了。