Scala Lift - динамически вызываемая функция - PullRequest
1 голос
/ 15 февраля 2012

У меня есть функция, которая загружает различные модели, и в настоящее время есть такие настройки:

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 "message" в какой-либо List или Object для возврата соответствующих данных?

Заранее спасибоза любую помощь, высоко ценится:)

1 Ответ

2 голосов
/ 15 февраля 2012

В 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

Обратите внимание на использование «_» для предотвращения оценки loadUser или loadChat при создании карты.

Лично я бы придерживался сопоставления с образцом.

...