Как работает «я» в актерах Scala? - PullRequest
3 голосов
/ 21 сентября 2011

Следующий фрагмент кода взят из раздела Программирование в Scala

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

Во-первых, в реаги {}, что делает рекурсивный вызов act ()?Похоже, что все дела потерпят неудачу, и он просто провалится до конца, ничего не делая.

Во-вторых, в книге они используют следующий пример REPL

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

Где «сам»' родом из?Я попытался повторить это в основном методе

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

Выше не работает

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011
  1. act() выполняется рекурсивно, если вы не отправите сообщение EXIT. Для любого другого сообщения, которое не соответствует ни EXIT, ни (name: String, actor: Actor), case msg не будет использовано. Другими словами case msg - это некий универсальный обработчик, который обрабатывает все несопоставленные сообщения.

  2. Actor.self - это надежный способ для ссылки на экземпляр актера изнутри тела актера (рекомендуется использовать self вместо this, обратиться к правильному экземпляру). В вашем случае вы звоните Actor.self не от актера, и, таким образом, он выходит из строя.

2 голосов
/ 21 сентября 2011
  1. Код внутри react вызывается только при наличии сообщения new . Таким образом, если вы вызываете рекурсивно act() внутри предложения case, субъект будет "ждать", пока не будет отправлено новое сообщение (без блокировки потока). Это альтернатива loop, когда вы хотите изменить поведение актера в соответствии с тем, что он получил. Здесь вы перестаете ждать сообщений, когда получаете "EXIT".

  2. self предполагается использовать внутри актера каждый раз, когда вы хотите использовать this.

...