2011-03-09 14 views
35

मेरे पास एक वेरिएबल ऑब्जेक्ट फू है, जो शून्य नहीं है। मैं foo.bar का उपयोग करना चाहता हूं, लेकिन केवल अगर यह मुझे 'ऐसी कोई संपत्ति नहीं है: कक्षा के लिए बार: जो कुछ भी' के साथ मुझे बम नहीं करेगा।ग्रोवी: संपत्ति का उपयोग सफल होने पर परीक्षण कैसे करें?

मैं निम्नलिखित परीक्षण करना चाहिए कैसे:

if (#test-here#) { 
    use(foo.bar) 
} 

उत्तर

61

object.hasProperty(propertyName) का उपयोग करें। यदि संपत्ति मौजूद है तो यह एक वास्तविक मूल्य (संपत्ति संदर्भ) वापस कर देगा। object.metaClass.hasProperty(instance, propertyName) भी संभव है। विधि अस्तित्व के परीक्षण के लिए object.respondsTo(methodName) का उपयोग करें।

+4

सावधान रहें कि यह बाध्यकारी में एक अपरिभाषित _variable_ के मामले के लिए काम नहीं करता है, जिसके लिए आपको 'binding.hasVariable (variableName)' की आवश्यकता है। –

+0

क्या यह उस मानचित्र पर काम करता है जहां आप "object.property" का उपयोग कुंजी "संपत्ति" के लिए मान प्राप्त करने के लिए कर सकते हैं? –

-5

मैं विशेष रूप से ग्रूवी के लिए नहीं बोल सकता है, लेकिन लगभग हर गतिशील भाषा में मैंने कभी ऐसा करने का मुहावरेदार तरह से उपयोग किया है सिर्फ क्या करना है यह, और अगर इसे फेंक दिया जाता है तो अपवाद को पकड़ें, और अपवाद हैंडलर में स्थिति को संवेदनापूर्वक संभालने के लिए जो भी करना है, वह करें।

+0

हाँ, मैंने सोचा कि। लेकिन मैं वास्तविक अपवादों के लिए अपवाद हैंडलिंग का उपयोग करना पसंद करता हूं, क्योंकि यह अधिक डीबगर-अनुकूल है। फिर भी धन्यवाद। – fernacolo

4

आप कम महत्वपूर्ण चीज़ें और बार आप लिख सकता है की बहुत सारी पर यह कर, तो कर रहे हैं (एक बार, लेकिन इससे पहले foo बनाई गई है):

Object.metaClass.getPropertySafe = 
    { delegate.hasProperty(it)?.getProperty(delegate) } 

तो फिर तुम लिख सकते हैं:

foo.getPropertySafe('bar') 
3

यह काम किया मेरे लिए:

Customer.metaClass.properties.find{it.name == 'propertyName'}. 

इस उदाहरण में ग्राहक एक डोमेन क्लास है। सुनिश्चित नहीं हैं कि अगर यह एक सादा ग्रूवी वर्ग

+0

जब आपके पास कक्षा का उदाहरण नहीं है, तो यह बहुत अच्छा काम करता है, यानी आपके उदाहरण खोजने के लिए गतिशील रूप से मानदंड बना रहे हैं। – Joseph

10

मेरी Gradle लिपियों में मैं यह करने के लिए काम करेंगे:

if(project.hasProperty("propertyThatMightExist")){ 
    use(propertyThatMightExist) 
} 
0
boolean exist = Person.metaClass.properties.any{it.name == 'propName'} 

अगर propName एक विशेषता है, मौजूद = सच// vice versa

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