2014-09-03 26 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)的文件中並放在同一目錄中。

我更好奇爲什麼你的第二個例子不會產生錯誤 - 但它肯定與你的兩個對象有關,不僅僅是名稱相同,而是完全相同。