2011-12-21 4 views
10

किसी को इस कोड को नष्ट कर सकता है जो Play20 ढांचे में ज़ेंट्स उदाहरण का हिस्सा है। मैं उत्सुक हूं कि यह कैसे काम करता है, मान लीजिए कि मैं जावा से स्कैला के लिए नया हूं इसलिए मेरे सिर को लपेटना बहुत मुश्किल है।स्कैला कोड

def IsAuthenticated(f: => String => Request[AnyContent] => Result) = 
    Security.Authenticated(username, onUnauthorized) { user => 
    Action(request => f(user)(request)) 
    } 
+0

जावा सिंटैक्स का उपयोग करके इसका प्रतिनिधित्व करने का कोई तरीका है, मुझे पता है कि यह वही नहीं है लेकिन विधि हस्ताक्षर को समझने में मेरी मदद कर सकता है। मुझे यहां संचालन के आदेश के साथ कठिन समय है। – chiappone

उत्तर

16

आपको हस्ताक्षर को थोड़ा विभाजित करने की आवश्यकता है। f एक ऐसा फ़ंक्शन है जो अभी तक गणना नहीं की गई स्ट्रिंग => String लेता है और अन्य फ़ंक्शन देता है जो Request[AnyContent] स्वीकार करता है और परिणाम देता है।

Security.Authenticated कॉल दो पैरामीटर सूचियों को स्वीकार करता है। एक जिसमें username और onUnauthorized है। दूसरा उपयोगकर्ता को स्वीकार करने और एक क्रिया वापस करने के लिए एक समारोह लेता है।

Action.apply विधि एक समारोह Request[AnyContent] => Result

हां, तो च 'curried' फैशन में कहा जाता है स्वीकार करता है। यह पहला कार्य कहा जाता है, और उसके बाद परिणामस्वरूप फ़ंक्शन का तुरंत उपयोग f(user)(request) होता है।

यहाँ एक ही बात desugared है और बदसूरत (कम से कम, सबसे अच्छा मैं कर सकते हैं):

def isAuthenticated(f: => String => Request[AnyContent] => Result) = 
    Security.Authenticated(username, onUnauthorized) { user: String => 
    Action.apply { request: Request[AnyContent] => 
     val hiddenTmp: Request[AnyContent] => Result = f(user) 
     hiddenTemp.apply(request) 
    } 
    } 

आप देख सकते हैं संकलक काम को हटाने प्रकार एनोटेशन का एक सा कर रही है। उम्मीद है कि यह समझाने में मदद करता है कि यह कैसे कच्चे स्केल में desugars। अनिवार्य रूप से, समारोह बहुत कार्यात्मक संरचना करता है।

2

सबसे पहले मेरा उत्तर करने के लिए एक उपयोगकर्ता पुस्तिका: मैं (anonymous functions देखें) एक समारोह है कि स्पष्ट रूप से नामित होने के बिना प्रयोग किया जाता है इंगित करने के लिए इटैलिक का प्रयोग करेंगे।

IsAuthenticated एक विधि है जो पैरामीटर के रूप में एक तर्क f लेता है f।

च एक समारोह जो एक पैरामीटर के रूप वाई लेता है और परिणाम का एक उदाहरण का उत्पादन

वाई एक समारोह जो एक पैरामीटर के रूप जेड लेता है और अनुरोध

की [AnyContent] एक उदाहरण का उत्पादन होता है है

जेड एक समारोह जो कोई पैरामीटर लेता है और एक स्ट्रिंग

IsAuthenticated कॉल Security.Authentic देता है एटेड, यूजरनेम और ऑन अनधिकृत (पास करने के लिए एक समारोह जब उपयोगकर्ता अनुरोधित कार्रवाई करने के लिए अधिकृत नहीं है) गुजर रहा है।

मैं पूरी तरह यकीन है कि यहाँ क्या अतीत हो रहा है myself- मैं स्काला yet- लेकिन साथ काफी है कि अच्छा नहीं कर रहा हूँ नहीं कर रहा हूँ मेरा अनुमान कि Security.Authenticated एक मामले वर्ग है, और निम्नलिखित के बराबर है है यह उपवर्गीकरण और जावा में एक निर्माता जोड़ने:

{ 
    Action(request => f(user)(request)) 
} 

अगर मेरे इस धारणा की कि ज्यादा सही है, तो कार्रवाई (जो Security.Authenticated पर एक विधि है) कहा जाता है, किया जा रहा है एक तर्क एक एक के रूप में गुजर।

एक ऐसा फ़ंक्शन है जो एक अनुरोध वस्तु (मैं इस वर्ग के नाम पर अनुमान लगा रहा हूं) लेता हूं और परिणाम उत्पन्न करता है। परिणाम का उपयोग यहां बताया गया है क्योंकि का कार्यान्वयन एफ के लिए एक कॉल है।

तो जब सुरक्षा का उप-वर्ग। प्रमाणीकृत किया जाता है, क्रिया को बुलाया जाता है, जो उपयोगकर्ता को कुछ क्रिया (स्ट्रिंग के रूप में निर्दिष्ट) के लिए प्रमाणीकृत करता है और फिर यदि उपयोगकर्ता प्रमाणित होता है, तो f (मूल पैरामीटर) देता है जो संभावित रूप से होता है क्रिया द्वारा बुलाया गया (उपर्युक्त प्रमाणीकरण के बाद)। एफ को यह कॉल एक परिणाम देता है, जो एक समारोह भी है। अंततः परिणाम के साथ अनुरोध (जिसे ) पैरामीटर के रूप में भेजा गया था।