एक बेहतर तरीका हो सकता है, लेकिन एक चाल invokeMethod
सीधे कॉल करने के लिए है:
String buildCatalog(Catalog catalog) {
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') {
delegate.invokeMethod('identity', [{
groupId(catalog.groupId)
artifactId(catalog.artifactId)
version(catalog.version)
}])
}
return writer.toString();
}
यह ग्रूवी पर्दे के पीछे प्रभावी रूप से क्या कर रहा है है। मुझे काम करने के लिए delegate.identity
या owner.identity
नहीं मिल सका, जो सामान्य चाल हैं।
संपादित: मैं पता लगा क्या हो रहा है।
ग्रोवी adds a method प्रत्येक ऑब्जेक्ट पर identity(Closure c)
के हस्ताक्षर के साथ।
इसका मतलब यह है कि आप गतिशील एक्सएमएल बिल्डर पर identity
तत्व को लागू करने की कोशिश की जब, जबकि एक एकल बंद बहस में गुजर, यह identity()
विधि है, जो बाहरी बंद पर delegate({...})
बुला की तरह है बुला रहा था।
मेटा ऑब्जेक्ट प्रोटोकॉल बाईपास और एक गतिशील पद्धति के रूप में विधि के इलाज के लिए, भले ही identity
पद्धति पहले से ही MetaObject पर मौजूद है invokeMethod
चाल बलों ग्रूवी का उपयोग करना।
यह जानकर, हम एक बेहतर, अधिक सुगम समाधान को एक साथ रख सकते हैं।
String buildCatalog(Catalog catalog) {
def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.catalog(xmlns:'http://www.sybrium.com/XMLSchema/NodeCatalog') {
// NOTE: LEAVE the empty map here to prevent calling the identity method!
identity([:]) {
groupId(catalog.groupId)
artifactId(catalog.artifactId)
version(catalog.version)
}
}
return writer.toString();
}
यह और अधिक पठनीय है, यह स्पष्ट है मंशा, और टिप्पणी करना चाहिए (उम्मीद) किसी को भी "अनावश्यक" खाली दूर करने से रोका जा सके: सभी हम क्या करना है विधि के हस्ताक्षर बदल सकता है इसलिए की तरह है नक्शा।
यह काम करता है, लेकिन क्या आप इसे समझा सकते हैं? प्रतिनिधि क्या है और प्रतिनिधि क्यों है प्रतिनिधिमंडल delegate.invokeMethod ('पहचान') से अलग है? –
मैंने इसे समझ लिया, मैं अपना जवाब अपडेट करूंगा। – OverZealous
एफवाईआई: एक्सएमएल ऑब्जेक्ट का निरीक्षण करने के लिए मैंने ग्रोवी कंसोल का उपयोग कर इसे ट्रैक किया। यह मुझे बताता है कि 'पहचान' विधि पहले से ही एक 'क्लोजर' के साथ इसके तर्क के रूप में मौजूद है। – OverZealous