2011-12-14 17 views
36

अगर कुछ एक सूची में हैग्रूवी संग्रह

if('b' in ['a','b','c']) 

"में" उपयोग करने के लिए लेकिन अगर आप अच्छी तरह से कैसे देख पा रहे हैं अगर कुछ एक संग्रह में नहीं है देखने के लिए ग्रूवी तरह से नहीं कर रहा?

if(!('g' in ['a','b','c'])) 

गन्दा लगता है और "!" अनौपचारिक नज़र में छिपा हुआ है। क्या ऐसा करने के लिए एक और बेवकूफ गड़बड़ तरीका है?

धन्यवाद!

उत्तर

22

मुझे लगता है कि दुर्भाग्यवश, not in सुंदर वाक्यविन्यास नहीं है। लेकिन आप इसे अधिक पठनीय बनाने के लिए एक सहायक चर का उपयोग कर सकते हैं:

def isMagicChar = ch in ['a', 'b', 'c'] 
if (!isMagicChar) ... 

या, इस मामले में, आप यह है लिखने के लिए एक regex :)

if (ch !=~ /[abc]/) ... 
19

एक और तरीका है का उपयोग कर सकते contains साथ, उदा

if (!['a', 'b', 'c'].contains('b')) 

यह ऑपरेटर को विधि कॉल के साथ बदलने की लागत पर कोष्ठक के अतिरिक्त स्तर को बचाता है। आपके उदाहरण के लिए

assert ['a','b','c'].any{it == 'b'} 
assert ['a','b','c'].every{it != 'g'} 

:

+3

फिर भी, 'contains' से' not' दूर डालता है यह आसान एक नज़र में याद कर रही है:/ –

7

अधिक पठनीय, मुझे यकीन है कि नहीं कर रहा हूँ

if (['a','b','c'].every{it != 'g'}) 

कुछ महीने पहले, मैं एक new operator overloading ! (not operator) का सुझाव दिया। अब, हो सकता है आप विस्मय के किसी भी विषम संख्या का उपयोग कर सकते हैं;)

if(!!!('g' in ['a','b','c'])) 
+1

अपने लिंक में Codehaus ग्रूवी परियोजना प्रबंधक ने कहा, "आप इन विधियों को जोड़ने के लिए हमेशा कुछ विस्तार मेटालास चाल या एक एएसटी परिवर्तन का उपयोग कर सकते हैं"। अब, अगर वह केवल लिखा होगा "मैं कुछ विस्तारित मेटाक्लास चाल या एक एएसटी परिवर्तन का उपयोग करूंगा, उनको जोड़ने के लिए कोडहॉस ग्रोवी की अगली रिलीज में कोई तरीका नहीं है"। तब हमें कोई समस्या नहीं होगी। –

+5

अगर (!!! ('g' में '' a ',' b ',' c '])) - "अगर जी वास्तव में वास्तव में वास्तव में इस सूची में नहीं है" – JesusFreke

0

Grails प्रलेखन के अनुसार के बारे में मापदंड here बनाते समय, आप कुछ इस तरह का उपयोग कर सकते हैं:

not {'in'("age",[18..65])} 

इस उदाहरण में, आप एक है "age" नाम की संपत्ति और आप पंक्तियां प्राप्त करना चाहते हैं जो 18 से 65 के बीच नहीं हैं। बेशक, [18..65] भाग को आपकी आवश्यक मूल्यों या श्रेणी की किसी भी सूची के साथ प्रतिस्थापित किया जा सकता है।

+1

सच है, लेकिन मेरा प्रश्न नहीं था विशेष रूप से एक मानदंड (जो एक एसक्यूएल क्वेरी का निर्माण कर रहा है) के बारे में जानना चाहता था। मैं जानना चाहता था कि ग्रोवी भाषा और पुस्तकालय आमतौर पर कुछ और संक्षिप्त का समर्थन करते हैं या नहीं। –

10

आप नए कार्यों जोड़ सकते हैं:

Object.metaClass.notIn = { Object collection -> 
    !(delegate in collection) 
} 


assert "2".notIn(['1', '2q', '3']) 
assert !"2".notIn(['1', '2', '3']) 

assert 2.notIn([1, 3]) 
assert !2.notIn([1, 2, 3]) 

assert 2.notIn([1: 'a', 3: 'b']) 
assert !2.notIn([1: 'a', 2: 'b']) 
संबंधित मुद्दे