1

我正在尝试掌握 scala 演员(我正在阅读“不耐烦的 Scala”),但下面的简短示例并没有像我预期的那样工作。

我有我想发送给演员的消息的案例类:

abstract class Message
case class Sum(x: Int, y: Int) extends Message
case class Stop() extends Message

以及演员应该如何处理它们:

import scala.actors.Actor

class Adder(val idx: Int) extends Actor {

  def act() {
    while(true) {
      receive {
        case Sum(x: Int, y: Int) => println("Total: " + (x+y) + ", by " + idx)
        case Stop => exit()
        case _ => println("Wrong message sent to: " + idx  + "!")
      }
    }
  }
}

在主对象中,我创建了一个 Adder 实例并发送一些消息:

object Main extends App{
  val adder = new Adder(0)
  println("Init")
  adder ! "Rafael"
  adder ! Sum(2, 3)
  adder ! Sum(5, 6)
  adder ! Stop()
  println("goodbye!")
}

但唯一的输出是“Init”和“goodbye!”的打印。我似乎找不到代码有什么问题。在尝试这个之前,我有一些工作演员,只是使用了相同的模式。我在这里做错了什么?

谢谢。

4

1 回答 1

3

您的程序在演员收到消息之前退出。

您可以添加Thread.sleep(1000)之前println("goodbye!")作为修补程序。

而不是Thread.sleep你可以等待你的演员的回答。在这种情况下,演员应该回复Stop消息。

请注意,不推荐使用 scala 演员,因此您应该使用akka演员。

同样不推荐使用没有参数的案例类,请使用case object Stop extends Message而不是case class.

于 2013-06-04T14:52:07.390 回答