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" と "さようなら!" の出力です。コードの何が問題なのかわかりません。これを試す前に、何人かの作業中のアクターがいて、同じパターンを使用しました。ここで何が間違っていますか?

ありがとう。

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 に答える