0

正如Play 框架的官方文档所建议的那样,我们可以使用隐式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

问题:为什么这个方法被声明为implicitrequest仅将参数声明为还不够implicit吗?

我希望看到的是:

def session(implicit request: RequestHeader) = request.session

4

1 回答 1

1

第一个implicit关键字确实根本不需要让您的示例编译。因此,要么是 Play! 中的错误,要么是附加implicit关键字旨在发挥其他作用。

特别是使用这个附加implicit关键字,您可以调用一个需要类型隐式值的方法,Session即使您RequestHeader在范围内只有一个类型的隐式值(session也定义了一个类型的隐式值RequestHeader,前提是您有一个类型的隐式值RequestHeaderin范围)。

于 2013-04-08T23:31:58.653 回答