2012-12-23 3 views
10

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)) 
    } 
} 

Play! Scala Security

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?

Odpowiedz

16

Co oznacza f: Użytkownik => Żądanie [AnyContent] => Wynik oznacza? Na pierwszy rzut oka wygląda to na metodę, która zwraca funkcję r typu Request; r następnie zwraca wynik.

f wraca do funkcji typu Request[AnyContent] => Result, to znaczy funkcją, która przyjmuje Request[AnyContent] i zwraca Result.

Innymi słowy f to funkcja curry. Można to nazwać jako f(user)(request), aby odzyskać numer Result.

+0

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. –

+2

@ 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

+0

dzięki za wyjaśnienie tego. Teraz ma sens. –

1

def withAuth(f: => String => Request[AnyContent] => Result) oznacza, że ​​f jest parametrem według nazwy, można napisać coś takiego:

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

gdzie chooseTheAction zajmuje String i zwraca funkcję wykonywania żądania Request[AnyContent] => Result