Scala中方法参数中的多个连续胖箭头是什么意思?

Cam*_*lis 10 scala playframework playframework-2.0

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

def m(p1:Int => Int) ...
Run Code Online (Sandbox Code Playgroud)

这意味着此方法采用返回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))
  }
}
Run Code Online (Sandbox Code Playgroud)

玩!Scala安全

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

这是正确的假设吗?

sep*_*p2k 16

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

f返回一个类型的函数Request[AnyContent] => Result,即一个带a Request[AnyContent]和返回a 的函数Result.

换句话说,f是一个curried函数.你可以称之为f(user)(request)取回一个Result.

  • @ CameronA.Ellis我不太清楚我理解你的评论.`Request`对象不返回任何内容.由`f`返回的函数,其类型为`Request [AnyContent] => Result`,返回一个`Result`.返回类型不能被排除在函数类型之外,因为它看起来像`f`返回一个`Request`对象 - 而不是一个带有`Request`对象的函数,这是完全不同的. (2认同)