14

アクターが別のメッセージで送信者に返信する例はたくさんありますが、API ドキュメントを参照しているときに !! と !?CanReply トレイトの一部である演算子 (これは 2.8 の新機能のようです: http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html )。したがって、受信/反応ブロックに値を返す、つまり、PartialFunction の戻り値の型を Unit 以外にするだけの場合ではないかと考えていました。

ソースを掘り下げて、それらがどのように使用されることを意図しているかを理解しようとしますが、誰かが洞察を持っているか、より詳細なドキュメントや例を知っている場合は、非常に感謝しています.

乾杯、ポール。

4

1 に答える 1

22

reply次に示すように、メソッドを使用して返信を送信できます。

import scala.actors._
class Reverser extends Actor {
  def act() { Actor.loop { react {
    case s: String => Thread.sleep(1000); reply(s.reverse)
    case _ => exit()
  }}}
}

返信を明示的に受け入れる方法は 3 つあります。

  • !!を返すを使用しますFuture。これは、必要なときにコンテンツを提供することを約束するコンテナー クラスです。すぐに戻りますが、実際にコンテンツを要求すると、他のスレッドが完了して要求を満たすまで待つ必要があります。
  • !?タイムアウトなしで使用します。他のスレッドが応答するまで、コードは一時停止します。
  • !?タイムアウトで使用します。コードは、応答を受け取るまで、またはタイムアウトになるまで一時停止します。

3 つすべての例を次に示します。

val r = new Reverser
r.start
val a = (r !! "Hi")
a() match {
  case s: String => println(s)
  case _ => println("Error A")
}
val b = r !? "Hello"
b match {
  case s: String => println(s)
  case _ => println("Error B")
}
val c = (r !? (500,"Howdy"))
c match {
  case Some(s: String) => println(s)
  case Some(_) => println("Error C")
  case None => println("Too slow!")
}
r ! None  // None isn't a string, so r will stop running

そして、これを実行すると、

iH
elloH
Too slow!
于 2010-05-14T20:06:56.230 に答える