使用Actors传递消息

我正在使用scala中的Actors编写一个程序,其中一个actor(Actor1)接受两个数字作为命令行参数,并将消息发送给另一个actor Actor2(计算它们的总和) . Actor2将结果发送给Actor1,Actor1在屏幕上打印它 .

class Actor1 extends Actor {
  def main(args: Array[String]) {   
    val n= Integer.parseInt(args(0))  
    val k= Integer.parseInt(args(1))  
    val actor2 = new Actor2   
    actor2 ! (n, k)  
  }

def act()
{    
           react{
                    case num: Integer =>
                    println(num)
                    case _=>
                    println("Sum not received")
                    exit

                   } 
}   
}
 class Actor2 extends Actor  {
    def act(){
       loop
       {
       react
            {
            case(n:Int, k:Int) =>
            val i = n + k
            val actor1 = new Actor1
             actor1 ! i}
         }
     }
    }

是否可以在扩展Actor的类中定义main(),还有其他方法可以接受Actor的命令行参数吗?它显示错误:类Actor1需要是抽象的,因为方法在特性中起作用类型()的反应器单元未定义 .

回答(1)

2 years ago

首先要做的事情是:您应该考虑使用akka而不是默认的Scala actor . 几乎在每个方面都更好......

除此之外,这里有几个答案:

  • 您的主要方法应该是独立对象(不是伴随对象) . 所以使用这样的东西: object Main { def main(args:Array[String]) { ... } } 并通过 Main 对象/类启动你的程序 . (这是因为 Actor1 类中的定义是非静态的,并且如果您定义伴随对象,则.class文件名会发生冲突 . )

  • 在您的代码中,括号似乎出现了问题 - 或者您是否故意将 Actor2 放在 Actor1 类中?如果您只创建三个单独的类/对象,它会更清晰: Actor1, Actor2, Main .

  • 当你创建Scala actor时,你必须明确地启动它们(akka 2.x不是这样) . 所以你错过了对 actor1.start 等的号召 . 请注意,您的程序将在演员终止之前终止,因此在添加之后不再停止 .

  • 最后,一些小提示:

  • 您可能需要考虑使用 !? 并将您的答案发送回原始呼叫者,因为这也允许您具有正确的终止条件 .

  • Integer.parseInt("0") 可以更简单地写成 "0".toInt