如何在邻居演员中写出两个主要功能?

时间:2014-09-03 09:02:42

标签: scala intellij-idea akka main intellij-13

我正在尝试使用akka,我已经写了两个带有主要功能的虚拟演员:

HelloActor

package akkaSample.severalSystems

import akka.actor.{Actor, ActorSystem}

class HelloActor extends Actor {
  def receive = {
    case "mew" => println("I said mew")
    case "hello" => println("hello back at you")
    case "shutdown" => context.stop(self)
    case _       => println("huh?")
  }
}
object Main extends App {
  val system = ActorSystem("HelloSystem")
  println("started")
}

OtherActor

package akkaSample.severalSystems

import akka.actor.{Actor, ActorSystem}

class OtherActor extends Actor {
  def receive = {
    case "mew" => println("I said mew")
    case _       => println("huh?")
  }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")
  println("started")
}

我正在尝试从intellij构思运行main函数(来自OtherActor和HelloActor)并得到编译错误:

Error:(12, 8) Main is already defined as object Main
object Main extends App {
       ^

为什么我明白了?主要功能放在不同的文件中!如何在scala / akka中编写2个主要函数并从相邻的actor中运行它们?

另外,对于没有扩展actor主函数工作的空scala类,这里是代码:

第一课

package akkaSample.mainError

class One {

}
object Main extends App {
  println("Hi!")
}

第二课

package akkaSample.mainError

class Two {

}

object Main extends App {
  println("Hi!")
}

没有编译错误。

P.S。仅用于试验我不打算将具有2个主要功能的代码投入生产。

2 个答案:

答案 0 :(得分:1)

您已经定义了两次具有相同名称的对象。编译器无法区分这两者。

扩展App的对象不需要调用Main。您可以拨打一个HelloActorMain和其他OtherActorMain。在这种情况下,sbt将允许您选择要运行的主类。

答案 1 :(得分:1)

编译器错误说明了一切:您正在尝试定义一个名为akkaSample.severalSystems.Main的对象,但是已经存在一个具有相同名称的对象。这是不可能的,因为编译器需要生成一个具有相同名称的JVM类(akkaSample.severalSystems.Main $),因此无法同时加载它们;此外,它们必须用相同名称的文件(Main $ .class)写在同一目录中。

我更好奇为什么你的第二个例子不会产生错误 - 但它肯定与你的两个对象有关,这两个对象不仅具有相同的名称,而且完全相同。