2012-12-23 16 views
10

Bir yöntem bu gibi bir kod vardır anlıyoruz: Çal gezinirken bu yöntemi anlamınaScala'da, parametre parametrelerindeki çoklu, art arda yağ okları nedir?

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

bir Int

döndüren bir fonksiyon p1 alır Ama!

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

f: User => Request[AnyContent] => Result ne anlama gelir: çerçeve kodu i çözülemez yöntemlerle bir özelliği bulundu? İlk bakışta, İstek tipi r işlevini döndüren bir yönteme benziyor; r, daha sonra Result değerini döndürür.

Doğru varsayım bu mu?

cevap

16

f: Kullanıcı => İstek [AnyContent] => Sonuç ne anlama geliyor? İlk bakışta, İstek türünde bir işlevi döndüren bir yönteme benziyor; r sonra bir Sonuç döndürür.

f tip Request[AnyContent] => Result bir fonksiyonu, bir Request[AnyContent] alır ve Result döner yani işlevini hesaplar.

Diğer bir deyişle, f, bir curried işlevidir. Result'u geri almak için f(user)(request) olarak çağırabilirsiniz.

+0

Ok, güzel. Fakat bunun neden belirtilmesi gerekiyor? Derleyici neden 'Request' döndürdüğü türden çıkamaz? Düzenleyin: nevermind, sanırım İsteği alt türleri farklı Sonuç Türleri döndürür, bu yüzden yardımcı olur. –

+2

@ CameronA.Ellis Yorumunuzu anladığımdan emin değilim. 'Request' nesnesi hiçbir şey döndürmez. 'Request [AnyContent] => Result' türüne sahip 'f' tarafından döndürülen işlev, bir' Sonuç 'döndürür. Geri dönüş tipi, bir fonksiyonun türünün dışında bırakılamaz çünkü o zaman bir 'Request 'nesnesini döndürür - bir' Request' nesnesini alan bir işlev değildir, bu oldukça farklıdır. – sepp2k

+0

bunu açıkladığınız için teşekkürler. Şimdi tam anlam ifade ediyor. –

1

def withAuth(f: => String => Request[AnyContent] => Result) araçları f bir by-name parametredir ve böyle bir şey yazabilirsiniz: chooseTheAction bir String alır ve bir isteği yerine getirilirken bir işlev döndürür

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

, Request[AnyContent] => Result

İlgili konular