我有一个方法,有很多隐式参数:
def hello(message:String)(implicit a:A,b:B,c:C, ..., user: User) = {...}
现在考虑这样一个类:
object Users extends Controller {
implicit a: A = ...
implicit b: B = ...
...
def index(id:String) = Action {
User.findById(id) match {
case Some(user) => {
implicit val _user = user
hello("implicit")
}
case _ => BadRequest
}
}
}
您可以在上面的示例中看到这一行:
implicit val _user = user
它的存在只是为了使对象
user
作为隐含对象。否则,我必须调用
hello
作为:
hello("implicit")(a,b,c,... user)
我在想是否有任何方法可以改进代码,例如我们不需要定义
_user
变量,但使
user
是隐含的。
请您参考如下方法:
是的,有办法消除_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
是一个案例类):
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
}
}
}
我希望这涵盖了您可能遇到的所有情况。