【问题标题】:Message passing using Actors使用 Actor 传递消息
【发布时间】:2012-09-02 21:36:52
【问题描述】:

我正在使用 scala 中的 Actor 编写一个程序,其中一个 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 需要是抽象的,因为未定义 ()Unit 类型的 trait Reactor 中的方法行为。

【问题讨论】:

  • Main 需要在一个对象中,而不是在一个类中。
  • @TonyK.I 尝试用对象代替 Actor1 的类,但它给出了类似的错误:无法创建对象,因为未定义 ()Unit 类型的 trait Reactor 中的方法行为

标签: scala


【解决方案1】:

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

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

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

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

  • 当您创建 Scala Actors 时,您必须显式启动它们(在 akka 2.x 中不是这样)。所以你错过了对actor1.start 等的电话。请注意,您的程序不会在您的演员终止之前终止,所以不要怀疑在您添加之后它是否不再停止。

  • 最后,一些小提示:

    • 您可能需要考虑使用 !? 并将您的答案发回给原始呼叫者,因为这也可以让您有一个适当的终止条件。
    • Integer.parseInt("0") 可以更简单地写成"0".toInt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2014-05-13
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多