用例类作为Scala中的消息

时间:2013-08-08 12:37:43

标签: scala abstract-class case message-passing

以下Horstman书中的示例代码(第291-292页)定义和使用案例类 作为简单的Scala actor系统中的消息。

问题是在接收模式匹配中没有识别类,并且控制正在落入 case _ => 语句。

下面列出了代码。一切都适用于非案例类消息。

SENDER :在演员Rcoord中,行为方法是:

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_reg 中,行为方法为:

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()

1 个答案:

答案 0 :(得分:5)

您有2个不同的类,名称相同CreateTS

您正在发送方中定义CreateTS,并尝试在接收方中接收其他类型的同名消息。

您应该从方法体移动案例类的声明,因此它将在两种方法的范围内。

请注意,不推荐使用scala actor,您应该使用akka actors。