2015-09-24 53 views
0

我想寫一些函數,它可以根據參數返回不同的Class對象。如何在Scala中使用Class

例如,我有一些擴展akka Actor的類,我想通過傳遞不同的Int值來獲得他們的類。下面的代碼是不正確的,但我想你能明白我的意思:

def createActor(num: Int): Unit { 
    val c: Class = o.getActorClass(num) 
    system.actorOf(Props[c]) ! "hello" 
} 

object o { 
    val m: Map[Int, Class] = Map(1->classOf[Actor1], 2->classOf[Actor2]) 
    def getActorClass(num: Int): Class { 
    m(num) 
    } 
} 

希望我的問題是可以理解的。謝謝!

+0

順便說一句,返回演員道具而不是班級是更好,更靈活的解決方案。 –

回答

0

我會創造一個發電機方法在給定的演員系統中創建一個新的映射,像這樣:

def newMapping(sys: ActorSystem, mappings: (Int, Props)*) = { 
    assert(sys != null) 
    val m = mappings.toMap 
    (i: Int) => sys.actorOf(m(i)) 
} 

然後你就可以創建具有不同ActorSystems不同的映射,並最終得到你想要的效果:

val sys = ActorSystem("sys1") 
val myMapping = newMapping(sys, 1 -> Props[Class1], 2 -> Props[Class2]) 

val actor1 = myMapping(1) 
val actor2 = myMapping(2) 
+0

謝謝,這是解決問題的一種方法。 –

1

如果你只是簡單地返回ActorRef,你應該沒問題。

def createActor(num: Int): ActorRef = { 
    val c = o.getActorClass(num) 
    val actor = system.actorOf(Props(c)) 
    actor ! "hello" 
    actor 
} 
+0

這不是真的。對象o中會發生一些錯誤,因爲類型不匹配。 –