【问题标题】:Having on trying to learn how to make a simple scala actor一直在尝试学习如何制作一个简单的 scala 演员
【发布时间】:2013-06-04 14:46:49
【问题描述】:

我正在尝试掌握 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!”的打印。我似乎找不到代码有什么问题。在尝试这个之前,我有一些工作演员,只是使用了相同的模式。我在这里做错了什么?

谢谢。

【问题讨论】:

    标签: scala actor


    【解决方案1】:

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

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

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

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

    不推荐使用不带参数的案例类,请使用case object Stop extends Message 而不是case class

    【讨论】:

    • 嗯...有道理!我现在明白了为什么我之前的例子有效:我有一个无限循环从标准输入请求消息,所以我总是有时间看到正在处理的消息。我会按照你的提示。谢谢!看来我的书已经严重过时了。你知道 scala Martin Odersky 的书在考虑什么版本吗?
    • @RafaelS.Calsaverini:您可以将akka documentation 用于演员,将scala documentation site 用于许多其他主题。例如,如果您想使用一些关于 scala 演员的教程和 akka 演员 The Scala Actors Migration Guide 可能会有所帮助。
    • @EndreVarga:我的母语不是英语。请告诉我如何修正这句话以使其更清晰:“请注意,不推荐使用 scala 演员,因此您应该使用 akka 演员。”
    • 对不起,我的错,我没有看到你明确提到它——我只是看到你上面的评论链接到 Akka 文档。
    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多