2012-12-23 22 views
10

मैं समझता हूँ कि एक विधि इस तरह कोड हो सकता है:स्केल में विधि पैरामीटर में एकाधिक, लगातार वसा तीर क्या करते हैं?

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

इस विधि जिसका मतलब है एक समारोह p1 कि एक इंट

रिटर्न लेता है लेकिन जब प्ले ब्राउज़ कर!

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 क्या मतलब है: ढांचे कोड मैं अपाठ्य तरीकों के साथ एक विशेषता पाया? पहली नज़र में यह एक विधि की तरह दिखता है जो अनुरोध के प्रकार r फ़ंक्शन देता है; r फिर Result देता है।

यह सही धारणा है?

उत्तर

16

एफ: उपयोगकर्ता => अनुरोध [AnyContent] => परिणाम का क्या अर्थ है? पहली नज़र में यह एक ऐसी विधि की तरह दिखता है जो अनुरोध प्रकार के फ़ंक्शन आर देता है; फिर एक परिणाम देता है।

f प्रकार Request[AnyContent] => Result के एक समारोह है, यानी एक समारोह है कि एक Request[AnyContent] लेता है और एक Result रिटर्न देता है।

दूसरे शब्दों f में एक curried कार्य है। Result वापस पाने के लिए आप इसे f(user)(request) के रूप में कॉल कर सकते हैं।

+0

ठीक है, ठंडा। लेकिन इसे निर्दिष्ट करने की आवश्यकता क्यों है? कंपाइलर उस प्रकार का अनुमान क्यों लगा सकता है जो 'अनुरोध' रिटर्न देता है? संपादित करें: कभी नहीं, मुझे लगता है कि अनुरोध के उपप्रकार विभिन्न प्रकार के परिणाम लौटा सकते हैं, इसलिए यह सहायक है। –

+2

@ कैमरून ए। एलिस मुझे पूरा यकीन नहीं है कि मैं आपकी टिप्पणी समझता हूं। 'अनुरोध' वस्तु कुछ भी वापस नहीं करती है। फ़ंक्शन 'f' द्वारा लौटाया गया है, जिसमें टाइप' अनुरोध [AnyContent] => परिणाम 'एक' परिणाम 'देता है। रिटर्न प्रकार को फ़ंक्शन के प्रकार से बाहर नहीं छोड़ा जा सकता है क्योंकि तब यह 'f' 'अनुरोध' ऑब्जेक्ट लौटाएगा - एक ऐसा फ़ंक्शन नहीं जो 'अनुरोध' ऑब्जेक्ट लेता है, जो काफी अलग है। – sepp2k

+0

इसे स्पष्ट करने के लिए धन्यवाद। अब कुल समझ में आता है। –

1

def withAuth(f: => String => Request[AnyContent] => Result) का मतलब है कि f एक उप-नाम पैरामीटर है, और आप कुछ इस तरह लिख सकते हैं:

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

जहां chooseTheAction एक String लेता है और एक फ़ंक्शन एक अनुरोध करते समय, Request[AnyContent] => Result