Rozumiem, że metoda ta może mieć kod jak poniżej:Co oznaczają wielokrotne, kolejne strzały tłuszczu w parametrach metody w Scali?
def m(p1:Int => Int) ...
Czyli tej metody trwa p1 funkcję, która zwraca int
Ale podczas przeglądania grać! Kod ramy znalazłem cechę ze sposobów odczytania:
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))
}
}
Czego f: User => Request[AnyContent] => Result
oznacza? Na pierwszy rzut oka wygląda to jak metoda zwracająca funkcję typu r
typu Żądanie; r
następnie zwraca Result
.
Czy to właściwe założenie?
Ok, chłodny. Ale dlaczego trzeba to określić? Dlaczego kompilator nie może wywnioskować typu zwracanego przez 'Request'? Edycja: nevermind, przypuszczam, że podtypy żądania mogą zwracać różne typy wyników, więc jest to pomocne. –
@ CameronA.Ellis Nie jestem pewien, czy rozumiem twój komentarz. Obiekt 'Request' nie zwraca niczego. Funkcja zwrócona przez 'f', która ma typ' Request [AnyContent] => Result' zwraca "Result". Typu zwracanego nie można pominąć w typie funkcji, ponieważ wtedy wyglądałoby na to, że 'f' zwrócił obiekt' Request' - nie funkcję, która przyjmuje obiekt 'Request', który jest całkiem inny. – sepp2k
dzięki za wyjaśnienie tego. Teraz ma sens. –