代码之家  ›  专栏  ›  技术社区  ›  pdbartlett

scala actors如何返回响应消息的值?

  •  14
  • pdbartlett  · 技术社区  · 14 年前

    有很多例子表明,参与者用另一条消息回复发送者,但在浏览API文档时,我注意到了!!!?属于canreply特性的操作员(这似乎是2.8的新特性: http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html )因此,我想知道是否只是让接收/响应块返回一个值的情况,即使partialFunction返回类型不是Unit?

    我将开始挖掘资料来源,试图找出它们的用途,但如果有人有任何见解或知道任何更深入的文档或例子,那么我将非常感谢。

    干杯, 保罗。

    1 回复  |  直到 14 年前
        1
  •  22
  •   Rex Kerr    14 年前

    可以使用此方法发送答复 reply ,如图所示:

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

    有三种方法可以明确地接受回复。

    • 使用 !! ,返回 Future ,这是一个容器类,它承诺在需要时提供内容。它会立即返回,但如果您实际请求内容,则必须等待另一个线程完成并填充请求。
    • 使用 !? 没有超时。您的代码将在另一个线程回复所需的时间内暂停。
    • 使用 !? 超时。您的代码将暂停,直到得到一个回复,或者直到超时结束,以先到者为准。

    下面是三个例子:

    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!
    
    推荐文章