2016-01-10 3 views
6

मैं ग्रोवी सीख रहा हूं और यह बहुत प्रभावित हूं कि यह एक बुद्धिमान डीएसएल बनाने की अनुमति देता है, लेकिन जब मैं ब्रांड्स और डॉट्स वैकल्पिक होते हैं तो नियमों से थोड़ा उलझन में हूं। ,ग्रोवी वैकल्पिक कोष्ठक और बिंदु

Integer take(Integer x) {x} 
take 3 plus 4 

यह अपेक्षा के अनुरूप काम करता है और (जब कंसोल में भाग गया) 7 का उत्पादन का उत्पादन के रूप में ग्रूवी take(3).plus(4) के रूप में है कि अंतिम पंक्ति को समझता है: निम्नलिखित कोड पर विचार करें।

अब, println take 3 plus 4 काम नहीं करता है क्योंकि ग्रूवी समझता है कि println(take).3(plus).4 जो बकवास है।

हर उदाहरण है कि मैं शो खुद से अभिव्यक्ति की इन प्रकार देख रहा हूँ एक लाइन पर, लेकिन जाहिरा तौर

s = take 3 plus 4 

काम करता है और भंडार में परिणाम 7। मेरा सवाल है,

println(take 3 plus 4) 

काम नहीं करता है? जाहिर है, ग्रोवी इन प्रकार के अभिव्यक्तियों को पार्स कर देगा, भले ही वे स्वयं एक लाइन पर न हों (जैसा कार्य सौंपा गया है)। मैंने सोचा होगा कि उन कोष्ठक जोड़ना उस रेखा के रूप में अस्पष्टता को हटा देगा जो काम नहीं करता है और यह 7 के रूप में प्रिंट करेगा जैसा कि मैंने इरादा किया था।

इसके बजाय groovy एक त्रुटि 'अप्रत्याशित टोकन: 3' देता है। जहां तक ​​मैं कह सकता हूं, groovy उस println के अंदर वैकल्पिक कोष्ठक या बिंदुओं की अनुमति नहीं देगा, भले ही यह संदिग्ध प्रतीत नहीं होता है। जब इस तरह की चाल काम करता है?

उत्तर

2

यह एक नेस्टेड विधि कॉल की श्रेणी में आता है, और उस स्थिति में आप कोष्ठक को छोड़ नहीं सकते हैं। यह अस्पष्टता पैदा कर रहा है और परिणाम अप्रत्याशित हैं, क्योंकि println विधि सोचती है कि आप इसे कई पैरामीटर पास कर रहे हैं। आप println विधि में एक groovy स्ट्रिंग का उपयोग करके अस्पष्टता को कम कर सकते हैं।

println "${take 3 plus 4}" 

और जानकारी: Omit Parentheses

+1

उस पते क्यों 'println 3 ले प्लस 4' काम नहीं करता है, लेकिन नहीं क्यों' println (3 ले प्लस 4) 'नहीं है के रूप में वहाँ नहीं करना चाहिए वहां कोई अस्पष्टता हो (यदि इसे कई मानकों के रूप में व्याख्या किया जाना था, तो उनके बीच एक अल्पविराम होगा इसलिए इतनी गड़बड़ी निर्धारित करने में सक्षम होना चाहिए कि इसका मतलब क्या नहीं था)। इसके अतिरिक्त यह लिंक कहता है कि इसे असाइनमेंट में काम नहीं करना चाहिए (हालांकि कोड उदाहरण यह काम करता है), लेकिन यह करता है। मुझे आश्चर्य है कि क्या यह अब थोड़ा पुराना है। भाषा गाइड काफी सख्त नहीं है और सुझाव देता है कि उस अंतिम रूप की तरह लपेटकर इसे काम करना चाहिए। – Matthew

+0

+1 मुझे यह दिखाने के लिए +1 कि मैं इसे println में कैसे काम कर सकता हूं, लेकिन मुझे यकीन नहीं है कि यह मेरे प्रश्न का पूरी तरह उत्तर दे। – Matthew

+0

यह संदिग्ध है क्योंकि प्रिंटल विधि को कोड का मूल्यांकन करने के बारे में पता नहीं है ** 3 प्लस 4 ** _to_ ** ले लो (3)। प्लस (4) ** इसके संचालन करने से पहले। '=' चिह्न के दाईं ओर सबकुछ एक अभिव्यक्ति है और चर के लिए असाइन किए जाने से पहले इसका मूल्यांकन किया जाता है। $ {} कह रहे हैं कि पहले इस कोड का मूल्यांकन करें, फिर उस पर println पर कॉल करें। – dspano