2011-12-11 16 views
8

मैं कोड के इस बिट में आए:ग्रोवी में कोई विधि कैसे काम करती है?

n = args[0] as Long 
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) } 

यह संरचना का एक पेड़ प्रपत्र मुद्रण के लिए प्रयोग किया जाता है। इस तरह:

* 
    *** 
    ***** 
******* 
    * 

(n = 4 के लिए)

  1. कैसे कोड [*n..1,n][4, 3, 2, 1, 4] उत्पादन करता है?

  2. any विधि कैसे काम करती है? Doc मुझे बहुत मदद नहीं करता है। भविष्यवाणी क्या है जिसे any पर पास किया जा सकता है (जैसा कि Doc में उल्लिखित है)?

any का उपयोग और इस मामले में इसका प्रबंधन कैसे किया जाता है?

+2

@DownVoter: क्यों एक डाउनवोट? इस सवाल में कोई भी गलत है;)? –

उत्तर

10

क्यू 1 ए: * एक सरणी "अनपैक"। .. एक सीमा बनाता है। [] एक संग्रह बनाता है।
क्यू 1 बी: *n..1 अपने व्यक्तिगत हिस्सों में [4,3,2,1] अनपैक करता है।
Q1C: [4,3,2,1,n] == [4,3,2,1,4]

Q2: मैं क्यों any यहां इस्तेमाल किया गया था पता नहीं है; each बस काम करता है, और संदर्भ में अधिक समझ में आता है। anyकनेक्शन पर लूप करता है, इसलिए println साइड-इफेक्ट फ़ंक्शंस इरादे के अनुसार।

आम तौर पर any यदि कोई संग्रह तत्वों, एक मानदंडों को पूरा उदाहरण के लिए निर्धारित करने के लिए इस्तेमाल किया जाएगा:

[*n..1,n].any { it > 10 } // Returns false, no elements are > 10 
[*n..1,n].any { it == 3 } // Returns true, because at least one element is 3 

बंद के अंतिम बयान निर्धारित करने के लिए प्रत्येक आइटम मानदंडों को पूरा करती प्रयोग किया जाता है। println शून्य लौटाता है, इसलिए any झूठी वापसी करेगा। मूल्य अप्रयुक्त और त्याग दिया जाता है।

एकमात्र कारण है कि मैं सोच सकता हूं कि किसी ने any का उपयोग किया है, कंसोल में each के वापसी मूल्य को देखने से बचने के लिए है। each मूल संग्रह देता है।

+1

'.any' का उपयोग करने का अन्य कारण कोड गोल्फ प्रतियोगिता में कम से कम वर्णों का उपयोग करना है [ऊंचाई के क्रिसमस पेड़ को कैसे मुद्रित करें] (http: // codegolf।stackexchange.com/q/4244) –

+0

@ArturoHerrero: वहां से सच है केवल कोड मिला;) –

3

1) n..1 एक सीमा शाब्दिक कहा जाता है, यह एक groovy.lang.Range उद्देश्य यह है कि n से 1 करने के लिए 1 से decrements पैदा करता है। यह तो का उपयोग कर आसपास के सूची संदर्भ में विलय कर दिया गया है "Spread operator (*)"

2) any विधि DefaultGroovyMethods में परिभाषित किया गया है और यह एक विधेय समारोह है कि सच रिटर्न है अगर एक संग्रह में एक तत्व की आपूर्ति की विधेय बंद को संतुष्ट करता है । इस उदाहरण में, कोड रिटर्न वैल्यू की जांच नहीं करता है, इसलिए मूल अन्य each कॉल के बजाय उसी आउटपुट का उत्पादन कर सकता था।

+0

उत्तर के लिए धन्यवाद;) –