我正在尝试掌握scala actor(我正在阅读"scala for the patience"),下面的简短示例没有像我预期的那样工作。
我有想要发送给actor的消息的case类:
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"one_answers"goodbye!"我似乎找不出代码有什么问题。在尝试这一个之前,我有一些工作演员,只是使用相同的模式。我哪里做错了?
谢谢。
程序在actor收到消息之前退出。
可以在println("goodbye!")
之前添加Thread.sleep(1000)
作为hotfix。
代替Thread.sleep
,你可以等待你的演员的回答。在这种情况下,演员应该回复Stop
消息。
请注意scala actor已被弃用,所以您应该使用akka actor。
没有参数的case类也不推荐使用,请使用case object Stop extends Message
而不是case class
。