2010-01-14 13 views
13

ग्रोवी "इन" ऑपरेटर को विभिन्न मामलों में अलग-अलग चीजों का मतलब लगता है। कभी-कभी x in y का अर्थ है y.contains(x) और कभी-कभी ऐसा लगता है कि y.isCase(x) पर कॉल किया गया है।ऑपरेटर में ग्रोवी कैसे काम करता है?

ग्रोवी को कैसे पता चलेगा कि किसको कॉल करना है? क्या कक्षाओं का एक विशेष वर्ग या समूह है जो ग्रोवी जानता है कि किसके बारे में .contains विधि का उपयोग किया जाता है? या क्या ऑब्जेक्ट्स में से किसी एक विधि के अस्तित्व से ट्रिगर किया गया व्यवहार है? क्या ऐसे कोई मामले हैं जहां ऑपरेटर को पूरी तरह से किसी और चीज में बदल दिया जाता है?

उत्तर

15

मैं कुछ प्रयोग किया था और यह in ऑपरेटर की तरह isCase विधि केवल के रूप में निम्नलिखित कोड

class MyList extends ArrayList { 
    boolean isCase(Object val) { 
     return val == 66 
    } 
} 

def myList = new MyList() 
myList << 55 
55 in myList // Returns false but myList.contains(55) returns true  
66 in myList // Returns true but myList.contains(66) returns false 

JDK संग्रह वर्गों के लिए मुझे लगता है कि जैसे in ऑपरेटर है यह सिर्फ लगता है द्वारा प्रदर्शन पर आधारित है लग रहा है पर आधारित है क्योंकि isCase() उन वर्गों के लिए पर कॉल करता है।

+1

ठीक है, यह समझ में आता है। मैं "इन" और isCase के बीच संबंधों के बारे में उलझन में था। एक केस लेबल के रूप में एक कंटेनर का उपयोग करते समय अब ​​मैं समझ सकता हूं। पुन: उपयोग करना ऑपरेटर के लिए केस थोड़ा आश्चर्यजनक है, क्योंकि यह स्ट्रिंग == सत्य में 'asdf' जैसे अप्रत्याशित अभिव्यक्तियों की अनुमति देता है। – ataylor

+0

यह सही है, लेकिन ग्रोवी के हिस्से में इमो गरीब है। जबकि केस कथन व्यवहार और तत्व युक्त संग्रह संग्रह के साथ एक ही तर्क का उपयोग करते हैं, वे अन्य स्थितियों में बहुत अलग हैं। उदाहरण के लिए, निम्नलिखित दावा पास नहीं होता है: 'buns' में 'b' पर जोर दें। यह कम से कम कहने के लिए counterintuitive है। –

+0

क्या कोई मुझे कृपया संक्षेप में बता सकता है कि क्या मतलब है? –

3

यह वास्तव में isCase पर आधारित है। ग्रोवी isCase method to Collections जोड़ता है जो कि विधि में आधारित है। IsCase के साथ किसी भी वर्ग का उपयोग किया जा सकता है।

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