我正在使用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 回答
首先要做的事情是:您应该考虑使用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