如何写出两个主要功能在相邻的演员



我正在试验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")
}

其他因素

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 idea的主函数(同时来自OtherActor和HelloActor),并得到编译错误:

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

我为什么得到它?主要功能放在不同的文件中!如何在scala/akka中编写2个主要函数,并从相邻的参与者那里运行它们?

此外,对于不扩展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.这只是为了试验,我不打算在生产中使用带有两个主要功能的代码。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新