Руководство по использованию блокирующего актера? - PullRequest
1 голос
/ 20 марта 2012

Я изо всех сил пытаюсь найти примеры, блоги и т. Д., В которых объясняется, как использовать оператор !? для отправки блокирующего сообщения актеру в Scala.Когда я (наивно) пытаюсь просто использовать его, ожидая, что он заблокируется, пока субъект не выполнил действие сообщения, поток просто блокируется.Например,

scala> :paste
// Entering paste mode (ctrl-D to finish)

class A extends Actor {
  def act {
    loop {
      react {
        case 5 => println("hello")
      }
    }
  }
}

// Exiting paste mode, now interpreting.

defined class A

scala> val a = new A
a: A = A@10115870

scala> a.start
res5: scala.actors.Actor = A@10115870

scala> a !? 5
hello
Execution interrupted by signal. // I just pressed Ctrl+C 

Я не могу найти ничего в своем издании «Программирование Scala», и я, вероятно, просто глуп, но кто-то может указать мне правильное направление?

От чегоЯ могу почерпнуть из документации по API. Мне нужен актер блокировки, чтобы отправить сообщение обратно вызывающей стороне?Но как и где звонящий получает это сообщение?Любые ссылки на примеры и т. Д. Будет приветствоваться.К сожалению, поиск в Google для !? менее чем полезен.

1 Ответ

4 голосов
/ 20 марта 2012

Отправитель получает сообщение как возвращаемое значение !?.Итак

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scala.actors.Actor._
class A extends Actor {
  def act {
    loop {
      react {
        case 5 => println("hello"); reply(0)
      }
    }
  }
}

// Exiting paste mode, now interpreting.

defined class A

scala> val a = new A
a: A = A@10115870

scala> a.start
res5: scala.actors.Actor = A@10115870

scala> a !? 5
hello
res6: Any = 0
...