जवाबों:
नहीं, आप बिना अपवाद के "प्रत्येक" को निरस्त नहीं कर सकते। आप एक क्लासिक लूप चाहते हैं यदि आप चाहते हैं कि ब्रेक एक विशेष स्थिति के तहत गर्भपात करे।
वैकल्पिक रूप से, आप प्रत्येक के बजाय "खोज" क्लोजर का उपयोग कर सकते हैं और जब आप ब्रेक करते हैं तो सच लौटाते हैं।
यह उदाहरण पूरी सूची को संसाधित करने से पहले समाप्त हो जाएगा:
def a = [1, 2, 3, 4, 5, 6, 7]
a.find {
if (it > 5) return true // break
println it // do the stuff that you wanted to before break
return false // keep looping
}
प्रिंटों
1
2
3
4
5
लेकिन 6 या 7 प्रिंट नहीं करता है।
कस्टम ब्रेक व्यवहार के साथ अपने स्वयं के पुनरावृत्ति तरीकों को लिखना भी वास्तव में आसान है जो क्लोजर स्वीकार करते हैं:
List.metaClass.eachUntilGreaterThanFive = { closure ->
for ( value in delegate ) {
if ( value > 5 ) break
closure(value)
}
}
def a = [1, 2, 3, 4, 5, 6, 7]
a.eachUntilGreaterThanFive {
println it
}
इसके अलावा प्रिंट:
1
2
3
4
5
find
बेहतर है any
- @ मिचल से नीचे दिए गए दूसरे जवाब को देखें कि एक मेरे लिए काम करता है
def test = [2] test.findResult{ it * 2 }
प्रत्येक लूप को किसी भी बंद के साथ बदलें ।
def list = [1, 2, 3, 4, 5]
list.any { element ->
if (element == 2)
return // continue
println element
if (element == 3)
return true // break
}
उत्पादन
1
3
any()
इस तरह से उपयोग करना थोड़ा भ्रामक है, लेकिन यह निश्चित रूप से काम करता है और आपको तोड़ने या जारी रखने की क्षमता देता है ।
नहीं, आप एक अपवाद को फेंकने के बिना ग्रूवी में बंद होने से नहीं टूट सकते। इसके अलावा, आपको नियंत्रण प्रवाह के अपवादों का उपयोग नहीं करना चाहिए।
यदि आप पाते हैं कि आप किसी बंद से बाहर निकलना चाहते हैं, तो आपको पहले यह सोचना चाहिए कि आप ऐसा क्यों करना चाहते हैं और यह कैसे करना है। सबसे पहले गौर करने वाली बात यह हो सकती है कि ग्रूवी (वैचारिक) उच्च श्रेणी के कार्यों में से एक में क्लोजर का प्रतिस्थापन हो सकता है। निम्न उदाहरण:
for ( i in 1..10) { if (i < 5) println i; else return}
हो जाता है
(1..10).each{if (it < 5) println it}
हो जाता है
(1..10).findAll{it < 5}.each{println it}
जो स्पष्टता में भी मदद करता है। यह आपके कोड के इरादे को बेहतर बताता है।
दिखाए गए उदाहरणों में संभावित दोष यह है कि चलना केवल पहले उदाहरण में ही रुक जाता है। यदि आपके पास प्रदर्शन संबंधी विचार हैं, तो आप इसे तब और वहीं रोकना चाहते हैं।
हालाँकि, अधिकांश उपयोग के मामलों के लिए जो पुनरावृत्तियों को शामिल करते हैं, आप आमतौर पर ग्रूवी के खोज, grep, संग्रह, इंजेक्शन, आदि तरीकों में से एक का सहारा ले सकते हैं। वे आमतौर पर कुछ "कॉन्फ़िगरेशन" लेते हैं और फिर "जानते हैं" कि आपके लिए पुनरावृत्ति कैसे की जाए, ताकि आप वास्तव में जहाँ भी संभव हो, अनिवार्य लूप से बच सकें।
बस विशेष बंद का उपयोग कर
// declare and implement:
def eachWithBreak = { list, Closure c ->
boolean bBreak = false
list.each() { it ->
if (bBreak) return
bBreak = c(it)
}
}
def list = [1,2,3,4,5,6]
eachWithBreak list, { it ->
if (it > 3) return true // break 'eachWithBreak'
println it
return false // next it
}
(1..10) .प्रत्येक {
यदि (यह <5)
इसे छापें
अन्य
विवरण झूठा है
each
, यह केवल 4. 4 से बड़ा मान नहीं छापता else
है। यह बहुत ही अच्छा है, आपका कोड इसके बिना भी ऐसा ही करेगा। इसके अलावा, आप यह साबित कर सकते हैं कि अगर आपने अभी और उसके ठीक पहले इसे each
नहीं तोड़ा है । return false
println "not breaking"
else
return false
आप इससे टूट सकते हैं RETURN
। उदाहरण के लिए
def a = [1, 2, 3, 4, 5, 6, 7]
def ret = 0
a.each {def n ->
if (n > 5) {
ret = n
return ret
}
}
इससे मेरा काम बनता है!
any
सरणी की विधि को वापस करके तोड़ सकते हैं false
। आप each
विधि को उसी तरह से नहीं तोड़ सकते ।