ग्रोवी मल्टी-लाइन स्ट्रिंग के साथ क्या गलत है?


105

ग्रूवी स्क्रिप्ट एक त्रुटि उठाती है:

def a = "test"
  + "test"
  + "test"

त्रुटि:

No signature of method: java.lang.String.positive() is 
applicable for argument types: () values: []

जबकि यह स्क्रिप्ट ठीक काम करती है:

def a = new String(
  "test"
  + "test"
  + "test"
)

क्यों?


5
यदि यह किसी और की मदद करता है, तो आप कोड जैसी त्रुटि प्राप्त कर सकते हैं def a = b + + "/" + c। इस मामले में दो + प्रतीक स्पष्ट रूप से समस्या है।
ज्योफ हैकवर्थ

जवाबों:


236

जैसा कि groovy में EOL मार्कर नहीं है (जैसे ;) यदि आप ऑपरेटर को निम्न पंक्ति पर रखते हैं तो यह भ्रमित हो जाता है

इसके बजाय यह काम करेगा:

def a = "test" +
  "test" +
  "test"

जैसा कि ग्रूवी पार्सर निम्नलिखित लाइन पर कुछ उम्मीद करना जानता है

ग्रूवी आपके मूल defको तीन अलग-अलग बयानों के रूप में देखता है । पहला असाइन करता testहै a, दूसरा दो "test"सकारात्मक बनाने की कोशिश करते हैं (और यह वह जगह है जहाँ यह विफल होता है)

साथ new Stringनिर्माता विधि, ग्रूवी पार्सर, निर्माता में अब भी है (के रूप में ब्रेस अभी तक बंद नहीं किया गया है) तो यह तार्किक एक सिंगल स्टेटमेंट में एक साथ तीन लाइनों में शामिल हो सकते

सच बहु-पंक्ति स्ट्रिंग्स के लिए, आप ट्रिपल उद्धरण का उपयोग कर सकते हैं:

def a = """test
test
test"""

तीन लाइनों पर परीक्षण के साथ एक स्ट्रिंग पैदा करेगा

इसके अलावा, आप इसे द्वारा भोजनालय बना सकते हैं:

def a = """test
          |test
          |test""".stripMargin()

stripMarginविधि बाईं ट्रिम जाएगा (करने के लिए और सहित |प्रत्येक पंक्ति से चार)


6
या इसके बजाय केवल स्ट्रिपइंडेंट () का उपयोग करें stripMargin()
sschuberth

हाँ, और |अतिरिक्त लाइनों पर
चार्ट को

4
आप """स्ट्रिंग्स के अंदर दोहरे उद्धरण चिह्नों का उपयोग कर सकते हैं
टिम 13'15

3
ठीक है, मैंने उत्तर को यह दिखाने के लिए संपादित किया है कि आपको stripIndent()काम करने के लिए कोड को थोड़ा सुधार करने की आवश्यकता होगी ।
sschuberth

2
क्योंकि a) मैंने पहले ही इसे एक टिप्पणी के रूप में पोस्ट कर दिया था, और b) यह इस उत्तर से बहुत अलग नहीं है।
sschuberth

18

इसी तरह stripMargin(), आप भी पट्टी () की तरह उपयोग कर सकते हैं

def a = """\
        test
        test
        test""".stripIndent()

वजह से

प्रमुख स्थानों की कम से कम संख्या वाली रेखा हटाने के लिए संख्या निर्धारित करती है।

आपको पहले "परीक्षण" को भी इंडेंट करने की आवश्यकता है और इसे सीधे inital के बाद नहीं डालना चाहिए """(यह \सुनिश्चित करता है कि मल्टी-लाइन स्ट्रिंग एक नई रेखा के साथ शुरू नहीं होती है)।


2
किस लिए है?
जो फिलिप्स

4
मैंने इसे बेहतर ढंग से समझाने के लिए अपने अंतिम वाक्य में सुधार किया है।
sschuberth

17

आप ग्रूवी को बता सकते हैं कि बयान में कोष्ठक की एक जोड़ी जोड़कर समाप्त होने वाली रेखा का मूल्यांकन करना चाहिए ( ... )

def a = ("test"
  + "test"
  + "test")

एक दूसरा विकल्प बैकस्लैश का उपयोग करना है, \प्रत्येक पंक्ति के अंत में:

def a = "test" \
  + "test" \
  + "test"

एफडब्ल्यूआईडब्ल्यू, यह पायथन मल्टी-लाइन स्टेटमेंट कैसे काम करता है, इसके समान है।


दूसरा यह भी है कि वीबीए मल्टीलाइन स्टेटमेंट कैसे काम करता है: डी (बैकस्लैश के बजाय केवल अंडरस्कोर के साथ, क्योंकि वीबीए।)
चार्ल्स वुड

जेनकिंसफाइल में दूसरा विकल्प मेरे लिए विफल रहा। पहला विकल्प काम किया।
सिल्वरजैन

नाइटपिक: पाइथन का उपयोग करते समय पायथन मल्टी-लाइन स्ट्रिंग को संघनन ऑपरेटर की आवश्यकता नहीं होती है, इसलिए यह बिल्कुल समान नहीं है।
बिग मैक्लेरजैग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.