12

我知道一个方法可以有这样的代码:

def m(p1:Int => Int) ...

这意味着此方法采用返回 Int 的函数 p1

但是在浏览 Play!框架代码我发现了一个具有难以理解的方法的特征:

trait Secured {

  def username(request: RequestHeader) = request.session.get(Security.username)

  def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Auth.login)

  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
      Action(request => f(user)(request))
    }
  }

  /**
   * This method shows how you could wrap the withAuth method to also fetch your user
   * You will need to implement UserDAO.findOneByUsername
   */
  def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
    UserDAO.findOneByUsername(username).map { user =>
      f(user)(request)
    }.getOrElse(onUnauthorized(request))
  }
}

玩!斯卡拉安全

是什么f: User => Request[AnyContent] => Result意思?乍一看,它看起来像一个返回rRequest 类型函数的方法;r然后返回一个Result.

这是正确的假设吗?

4

2 回答 2

17

f: User => Request[AnyContent] => Result 是什么意思?乍一看,它看起来像一个返回 Request 类型的函数 r 的方法;r 然后返回一个结果。

f返回类型Request[AnyContent] => Result的函数,即接受 aRequest[AnyContent]并返回 a的函数Result

换句话说f,是一个柯里化函数。你可以称它为f(user)(request)取回一个Result.

于 2012-12-23T17:47:08.737 回答
1

def withAuth(f: => String => Request[AnyContent] => Result)意思是,这f是一个按名称的参数,你可以这样写:

withAuth {
  logger.info("Here we go")
  ...
  chooseTheAction("list")
}

wherechooseTheAction接受一个String并返回一个执行请求的函数,Request[AnyContent] => Result

于 2012-12-23T22:30:20.217 回答