2014-09-03 39 views
0

我与阿卡尝试,我已经写了与主要功能两个虚拟角色在其中:如何在邻居演员中编写两个主要功能?

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想法(来自OtherActor和HelloActor)的函数并且得到编译错误:

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

为什么我得到它?主要功能放在不同的文件中!如何在Scala/akka中编写2个主要功能并从邻居角色运行它们?

与空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个主要功能的代码。

+0

我用sbt编译了代码,我也收到了与原始scalac相同的错误。 'scalac src/main/scala/akkaSample/mainError/One.scala src/main/scala/akkaSample/mainError/Two.scala' – 2014-09-03 09:12:43

回答

1

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

扩展为App的对象不需要叫做Main。您可以拨打一个HelloActorMain和其他OtherActorMain。在这种情况下,sbt会让你选择运行哪个主类。

+0

但是为什么两个没有扩展Actor trait的空类不会生成编译时错误? (在这个问题中见“一”和“二”类) – Cherry 2014-09-03 09:40:45

1

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

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