无用的隐式关键字分配给方法? / Play框架2

时间:2013-04-08 22:06:15

标签: scala playframework-2.0

正如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

1 个答案:

答案 0 :(得分:1)

根本不需要第一个implicit关键字来允许您的示例进行编译。因此,无论是Play!中的错误,还是额外的implicit关键字都打算扮演另一个角色。

特别是使用这个额外的implicit关键字,您可以调用一个期望类型为Session的隐式值的方法,即使您在范围内只有隐式值RequestHeadersession还定义了RequestHeader类型的隐式值,前提是您在范围内具有类型为RequestHeader的隐式值。