Да, есть способ исключить переменную _user
, сделав user
неявным:
def index(id:String) = Action {
User.findById(id) map (implicit user => hello("implicit")) getOrElse BadRequest
}
ОБНОВЛЕНИЕ: Обращаясь к вашему вопросу о многих случаях в комментариях ниже.
Все зависит от того, какой тип значения возвращает User.findById
. Если это Option[User]
, но вы хотите сопоставить его с определенными пользователями (при условии, что User
является классом дел), то применяется оригинальное решение:
def index(id:String) = Action {
User.findById(id) map { implicit user =>
user match {
case User("bob") => hello("Bob")
case User("alice") => hello("Alice")
case User("john") => hello("John")
case _ => hello("Other user")
}
} getOrElse BadRequest
Или вы можете сопоставить что угодно, если хотите, если User.findById
равно String => Option[User]
Если, с другой стороны, User.findById
равно String => User
, тогда вы можете просто определить вспомогательный объект, например:
object withUser {
def apply[A](user: User)(block: User => A) = block(user)
}
И используйте его следующим образом (опять-таки, предполагая, User
- это класс case):
def index(id: String) = Action {
withUser(User findById id) { implicit user =>
user match {
case User("bob") => hello("Bob")
case User("alice") => hello("Alice")
case User("john") => hello("John")
case _ => BadRequest
}
}
}
или совпадение с другим значением, скажем, Int
:
def index(id: String, level: Int) = Action {
withUser(User findById id) { implicit user =>
level match {
case 1 => hello("Number One")
case 2 => hello("Number Two")
case 3 => hello("Number Three")
case _ => BadRequest
}
}
}
Я надеюсь, что это охватывает все возможные сценарии.