2011-01-16 11 views
10

मेरे पास एक डोमेन क्लास है जो स्ट्रिंग्स (यूट्यूब लिंक्स) की एक सूची है।ग्रोवी बंद करने के अंदर "इसे" अपडेट करना

इन लिंक को सहेजते समय मैं वीडियो आईडी को बाहर करना चाहता हूं और यूआई पक्ष में दर्ज पूरे यूआरएल के बजाय इसे सहेजना चाहता हूं।

यह है कि मैं क्या (उपेक्षा कि regex से दोषपूर्ण है)

youtubeLinks.each { 
def youtubeRegex = /v=(.*)/ 
def matcher = (it =~ youtubeRegex) 
it = matcher[0][1] 
} 

जब मैं इस बचाने के लिए, यह "यह" की मूल मूल्य की बचत होती है कोशिश कर रहा हूँ है। क्या इस संदर्भ को अद्यतन करने का कोई तरीका है और इसे ठीक से सहेजना है?

धन्यवाद।

उत्तर

21

ग्रोवी का each लूप केवल एक पुनरावर्तक है, और इस तरह यह न तो उस संग्रह को प्रभावित करता है जिस पर यह काम करता है, न ही अपने आप का मूल्य देता है। यह मूल रूप से जावा के "लूप के लिए उन्नत (प्रत्येक के लिए उन्नत) के बराबर है," केवल गतिशील टाइपिंग और एक अंतर्निहित पाश चर (यह) की सुविधा के साथ। जबकि it को संशोधित किया जा सकता है, यह एक व्यर्थ उद्यम है, क्योंकि आप मूल मूल्य का संदर्भ बदल रहे होंगे, न कि मूल्य स्वयं। उस पर अधिक के लिए this question देखें।

जब आपको किसी संग्रह के भीतर हर तत्व को संशोधित करने की आवश्यकता होती है, तो idiomatic Groovy (Grails) समाधान collect विधि का उपयोग करना है। आपके द्वारा प्रदान किए जाने वाले बंद होने के माध्यम से प्रत्येक तत्व को प्रतिस्थापित करें, आखिरकार एक नया संग्रह लौटाएं (इसलिए, यह वास्तव में कुछ भी "संशोधित नहीं करता है)।

मूल रूप से, आप शायद कुछ इस तरह के लिए करना चाहेंगे: वहाँ वास्तव तरीके एक ग्रूवी में के बारे में इस तरह के एक कार्य के लिए जा सकते हैं की एक संख्या

def links = '''http://www.youtube.com/watch?v=fl6s1x9j4QQ 
http://www.youtube.com/watch?v=tCvMKcNJCAY 
''' 

assert (links =~ /watch\?v=(.*)/).collect{match -> match[1]} == ["fl6s1x9j4QQ", "tCvMKcNJCAY"] 

..Though।

इसके अतिरिक्त, Ted Naleid's blog में ग्रोवी पैटर्न मिलान के कुछ अच्छे उदाहरण हैं जो आपको उपयोगी मिल सकते हैं।

संपादित यहाँ कई तरीके है जिसमें आप समाधान आपके द्वारा भेजी संक्षिप्त कर सकते हैं:

youtubeLinks = youtubeLinks.collect{link -> (link =~ /\?v=(.*)$/)[0][1]} 

या

youtubeLinks = youtubeLinks.collect{link -> link.replaceAll(/^.*\?v=/, "") } 

या इस (हालांकि यह एक छोटे से काल्पनिक है)

youtubeLinks = youtubeLinks.join('\n').replaceAll(/.*\?v=/, '').split() 
+0

धन्यवाद! मैं इसे देख लूंगा। – user577905

+0

मुझे आपके संपादन पसंद हैं। धन्यवाद! – user577905

+0

कूल जवाब। लेकिन दूसरे लिंक पर वीडियो हटा दिया गया है = ( – epidemian

2

आप ri थे ght, यह

youtubeLinks = youtubeLinks.collect { 
    def youtubeRegex = /v=(.*)[&]/ 
    def matcher = (it =~ youtubeRegex) 
    return matcher[0][1] 
} 

धन्यवाद, नॉर्थओवर की तरह समाप्त हो गया।

+1

खुशी है कि मैं मदद कर सकता हूं। अगर आप कोड को समेकित करने के तरीकों में रूचि रखते हैं तो मैंने अपने उत्तर में कुछ अतिरिक्त कामकाजी समाधान जोड़े हैं। चीयर्स। – Northover

संबंधित मुद्दे