2013-06-12 4 views
5

मैं इनग्रूवी बंद स्पष्टीकरण

def printSum = {a,b -> 
    println a+b 
} 

printSum(5,7) // 12 

हालांकि तरह सामान्य ग्रूवी बंद से परिचित हूँ, मैं मैं एक कठिन समय समझ है SpringWS प्लगइन से कोड में आए ऊपर एक बंद है।

यह इस तरह किया जा रहा है:

def namespace = "http://www.myveryimportantcompany.com/hr/schemas" 
    def serviceURL = "http://localhost:8080/myapp/services" 
    def response = withEndpointRequest(serviceURL) { 
     HolidayRequest(xmlns: namespace) { 
      Holiday { 
       StartDate("2006-07-03") 
       EndDate("2006-07-07") 
      } 
      Employee { 
       Number("42") 
       FirstName("Russ") 
       LastName("Miles") 
      } 
     } 
    } 

अगर serviceURL में तो जहां पेलोड है पारित कर दिया जा रहा है?

क्या कोई इस स्निपेट को कुछ विस्तार से समझा सकता है?

+0

ऐसा लगता है कि पेलोड विधि अवरोधन किसी तरह का साथ प्लगइन द्वारा इंजेक्ट किया जाता है करने के लिए बंद पारित करने के लिए। – moskiteau

+0

ऐसा लगता है कि ब्रेसिज़ में सामान पेलोड ('HolidayRequest') है। शायद ग्रोवी में कुछ वाक्य रचनात्मक चीनी है जो आपको इस तरह फ़ंक्शन तर्क निर्दिष्ट करने देती है?'प्रिंटसम (5) {7}' या उसके जैसा कुछ भी कॉल करके इसका परीक्षण करने का प्रयास करें। – rliu

उत्तर

4

उपरोक्त कार्यान्वयन में, withEndpointRequest एक बंद है जो दो पैरामीटर लेता है।

withEndpointRequest(String serviceUrl, Closure payload)

जब आप अपने ग्राहक से withEndpointRequest उपयोग कर रहे हैं, आप वास्तव में withEndpointRequest साथ बंद इनलाइन की घोषणा के द्वारा

def namespace = "http://www.myveryimportantcompany.com/hr/schemas" 
    def serviceURL = "http://localhost:8080/myapp/services" 
    def payload = { 
     HolidayRequest(xmlns: namespace) { 
      Holiday { 
       StartDate("2006-07-03") 
       EndDate("2006-07-07") 
      } 
      Employee { 
       Number("42") 
       FirstName("Russ") 
       LastName("Miles") 
      } 
     } 
    } 
    def response = withEndpointRequest(serviceURL, payload) 

ऊपर groovier बनाया गया था कर रहे हैं। ऊपर के रूप में भी

def response = withEndpointRequest(serviceURL, { 
     //payload goes here as an inline closure as the second parameter 
     HolidayRequest(xmlns: namespace) { 
      Holiday { 
       StartDate("2006-07-03") 
       EndDate("2006-07-07") 
      } 
      Employee { 
       Number("42") 
       FirstName("Russ") 
       LastName("Miles") 
      } 
     } 
    }) 

जो कम वर्बोज़ है लिखा जा सकता है। अंत में, यह सुव्यवस्थित किया जा सकता है और अधिक groovier बनाया के रूप में

def response = withEndpointRequest(serviceURL) { 
     HolidayRequest(xmlns: namespace) { 
      Holiday { 
       StartDate("2006-07-03") 
       EndDate("2006-07-07") 
      } 
      Employee { 
       Number("42") 
       FirstName("Russ") 
       LastName("Miles") 
      } 
     } 
    } 

एक बात लिख यहाँ ध्यान दें कि Closure payload पिछले पैरामीटर है है के द्वारा।

अब ध्यान दें कि बंद करें (payload) payload.call() को तब तक नहीं बुलाया जाता है जैसा कि SpringWS प्लगइन के अंदर आपके प्रश्न में उल्लिखित है।

Closures as Method Arguments पर एक नज़र डालें।

मुझे उम्मीद है कि मैं आपको जो समझना चाहता हूं उसे व्यक्त करने में सक्षम था। :)

0

निम्नलिखित स्निपेट, here पोस्ट किया गया, एक विधि में बंद होने के लिए उपयोग किए जाने वाले कई विकल्पों का एक अवलोकन देता है।

दो तर्कों के साथ विधि। अंतिम तर्क एक बंद है।

def work(input, cl) { 
    cl(input) 
} 

एक बंद परिभाषित करें।

def assertJava = { 
    it == 'Java' 
} 

तरीके विधि

work('Java', assertJava) 

work 'Java', assertJava // No parenthesis. 

work('Groovy', { 
    assert it == 'Groovy' 
}) // Anonymous closure as argument. 

work('Groovy') { 
    assert it == 'Groovy' 
} // Last argument is closure and can be outside parenthesis. 

work('Groovy') 
{ 
    assert it == 'Groovy' 
} // Opening bracket on new line. If we want a code block (e.g. static initializer) instead of closure we must use ; to separate code. 


work 'Groovy', { 
    assert it == 'Groovy' 
} // Pay attention, no parenthesis, so comma is needed again! 


// Does not work: 
// 
// Comma between argument list needed: 
// work 'Groovy' { 
//  assert it == 'Groovy' 
// }