正如official documentation of Play framework建议的那样,我们可以使用隐式request
来改进对与请求相关联的某些对象的访问。
样品:
def index = Action { implicit request =>
session.get("connected").map { user =>
Ok("Hello " + user)
}.getOrElse {
Unauthorized("Oops, you are not connected")
}
}
这是因为添加了属于implicit
特征的以下Controller
方法:
/**
* Retrieves the session implicitly from the request.
*
* For example:
* {{{
* def index(name:String) = Action { implicit request =>
* val username = session("username")
* Ok("Hello " + username)
* }
* }}}
*/
implicit def session(implicit request: RequestHeader) = request.session
问题:为什么此方法被声明为implicit
?仅将request
参数声明为implicit
我希望看到相反:
def session(implicit request: RequestHeader) = request.session
答案 0 :(得分:1)
根本不需要第一个implicit
关键字来允许您的示例进行编译。因此,无论是Play!中的错误,还是额外的implicit
关键字都打算扮演另一个角色。
特别是使用这个额外的implicit
关键字,您可以调用一个期望类型为Session
的隐式值的方法,即使您在范围内只有隐式值RequestHeader
( session
还定义了RequestHeader
类型的隐式值,前提是您在范围内具有类型为RequestHeader
的隐式值。