0

我正在使用 scala 中的 Actor 编写一个程序,其中一个 Actor(Actor1)接受两个数字作为命令行参数并向另一个 Actor 发送消息(它计算它们的总和)。Actor2 将结果发送给 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 需要是抽象的,因为未定义 ()Unit 类型的 trait Reactor 中的方法行为。

4

1 回答 1

1

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

除此之外,这里有几个答案供您参考:

  • 您的主要方法应位于独立对象(而不是伴随对象)中。所以使用这样的东西:并通过对象/类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
于 2012-09-10T06:21:42.643 回答