Что означает несколько последовательных жирных стрелок в параметрах метода в Scala?
Я понимаю, что метод может иметь такой код:
def m(p1:Int => Int) ...
Это означает, что этот метод принимает функцию p1, которая возвращает Int
Но при просмотре 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))
}
}
Играть! Scala Безопасность
Что означает f: User => Request[AnyContent] => Result
? На первый взгляд это выглядит как метод, возвращающий функцию r
типа Request; r
затем возвращает a Result
.
Это правильное предположение?
Ответы
Ответ 1
Что означает f: User = > Request [AnyContent] = > Результат? На первый взгляд он выглядит как метод, возвращающий функцию r типа Request; r затем возвращает результат.
f
возвращает функцию типа Request[AnyContent] => Result
, то есть функцию, которая принимает Request[AnyContent]
и возвращает a Result
.
Другими словами f
является кардной функцией. Вы можете назвать его f(user)(request)
, чтобы вернуть Result
.
Ответ 2
def withAuth(f: => String => Request[AnyContent] => Result)
означает, что f
является параметром by-name, и вы можете написать что-то вроде этого:
withAuth {
logger.info("Here we go")
...
chooseTheAction("list")
}
где chooseTheAction
принимает String
и возвращает функцию, выполняющую запрос, Request[AnyContent] => Result