0

Horstman の書籍 (291 ~ 292 ページ) のサンプル コードに従って 、単純な Scala アクター システムでケース クラスをメッセージとして定義および使用しています。

問題は、ケース クラスが受信パターン マッチングで認識されず、制御がcase _ =>ステートメントに渡されることです。

コードを以下に示します。非ケースクラスのメッセージですべてが機能します。

SENDER : アクター Rcoord のactメソッドは次のとおりです。

def act() {
  alive(9000) 
  register('rcoord, self) 
  proc_reg.start                   // start the process register actor  

  loop {
    try {
      receive {
        case 'process => 
          process_counter += 1
          process_number = process_counter
          spawn_process(process_number, sprocs)
          case class CreateTS(xxx: Int)
          proc_reg ! CreateTS(process_number)

        case 'stats => 
          Console.println("received msg from client to view statistics")
          //sender ! 'ok

        case 'stop => 
          Console.println("received msg that client is terminating")
          //sender ! 'bye
      } // end receive
    }
    catch
    {

RECEIVER : アクターproc_regactメソッドは次のとおりです。

def act() {
  Console.println("process register started")

  case class CreateTS(process_number: Int)
  case class UpdateTS(process_number: Int)

  loop {
    receive {
      case CreateTS(process_number) =>
        Console.println("create TS msg received from process "+process_number)
        register_proc(process_number)

      case UpdateTS(process_number) =>
        Console.println("update TS msg received for process "+process_number)
        update_proc(process_number)

      case _ =>
        Console.println("sender is: "+sender.toString)
        //Console.println("full msg is: "+Msg.toString)
    }  // end receive
  }    // end loop
}      // end act()
4

1 に答える 1

5

同じ名前の 2 つの異なるクラスがありますCreateTS

送信CreateTS者で定義されたものを送信し、受信者で同じ名前の他のタイプのメッセージを受信しようとしています。

ケース クラスの宣言をメソッド本体から移動して、両方のメソッドのスコープに入れる必要があります。

scala アクターは非推奨であることに注意してください。akka アクターを使用する必要があります。

于 2013-08-08T12:53:41.343 に答える