2012-02-15 64 views
1

我有它加載各種機型的功能,目前有這種設置:斯卡拉電梯 - 動態調用的函數

if(message == "user") { 

    var model = User.findAll(

     ("room" -> "demo") 

    ) 

} else if (message == "chat") { 

    var model = Chat.findAll(

     ("room" -> "demo") 

    ) 

} 

這確實是笨重,因爲我的目標是多多補充更多的車型在未來,我知道在JavaScript,你可以做這樣的事情:

var models = { 

    "user" : load_user, 
    "chat" : load_chat 

} 

其中「load_user」和「load_chat」將加載相應的模型,這樣我就可以做簡化了整個事情:

var model = models[message](); 

有沒有一種方法可以在Scala中做類似的事情,所以我可以有一個簡單的函數,它只是將「消息」var傳遞給List或某種對象以返回相關數據?

在此先感謝您的幫助,非常感謝:)

回答

2

在Scala中,你可以這樣做:

val model = message match { 
    case "user" => loadUser() // custom function 
    case "chat" => loadChat() // another custom function 
    case _ => handleFailure() 
} 

您可以也用地圖的工作就像你在你的JavaScript例子一樣,像這樣:

scala> def loadUser() = 1 // custom function 
loadUser: Int 

scala> def loadChat() = 2 // another custom function 
loadChat: Int 

scala> val foo = Map("user" -> loadUser _, "chat" -> loadChat _) 
foo: scala.collection.immutable.Map[java.lang.String,() => Int] = Map(user -> <function0>, chat -> <function0>) 

scala> foo("user")() 
res1: Int = 1 

注重以防止loadUserloadChat評價創建地圖時使用「_」。

個人而言,我會堅持模式匹配。

+0

輝煌,正是我所期待的。非常感謝您的幫助 :) – jhdevuk 2012-02-15 17:40:30