গ্রোভির মাল্টি-লাইন স্ট্রিংয়ে কী সমস্যা?


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

গ্রোভির যেমন ইওল চিহ্নিতকারী নেই (যেমন ;) আপনি নিম্নলিখিত লাইনে অপারেটরটি রাখেন তা বিভ্রান্ত হয়ে পড়ে

এটি পরিবর্তে কাজ করবে:

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
আপনি """স্ট্রিংয়ের ভিতরে ডাবল উক্তি ব্যবহার করতে পারেন
টিম_ইয়েটস

3
ঠিক আছে, stripIndent()কাজটি করার জন্য আপনাকে কীভাবে কোডটির সামান্য পুনরায় ফর্ম্যাট করতে হবে তা উত্তর দেওয়ার জন্য আমি সম্পাদনা করেছি ।
স্কুবার্থ

2
কারণ ক) আমি ইতিমধ্যে এটি একটি মন্তব্য হিসাবে পোস্ট করেছি এবং খ) এটি এই উত্তর থেকে খুব বেশি আলাদা নয়।
স্কুবার্থ

17

আপনি গ্রোভিকে বলতে পারেন যে বিবৃতিতে এক জোড়া বন্ধনী যুক্ত করে শেষের লাইনটি মূল্যায়ন করা উচিত ( ... )

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

দ্বিতীয় বিকল্পটি হ'ল \প্রতিটি লাইনের শেষে একটি ব্যাকস্ল্যাশ ব্যবহার করা :

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

এফডাব্লুআইডাব্লু, পাইথন মাল্টি-লাইন স্টেটমেন্টগুলি কীভাবে এটি কাজ করে তার সমান।


দ্বিতীয়টি হ'ল ভিবিএ মাল্টলাইন স্টেটমেন্টগুলি কীভাবে কাজ করে: ডি (কেবল ব্যাকস্ল্যাশগুলির পরিবর্তে আন্ডারস্কোরগুলি সহ, কারণ ভিবিএ))
চার্লস উড

দ্বিতীয় বিকল্পটি জেনকিনসফাইলে আমার জন্য ব্যর্থ হয়েছিল। প্রথম বিকল্প কাজ করেছে।
সিলভারজান

নিতপিক: পেরেনগুলি ব্যবহার করার সময় পাইথন মাল্টি-লাইন স্ট্রিংয়ের জন্য কনক্যাটেনশন অপারেটরের প্রয়োজন হয় না, তাই এটি ঠিক একই নয়।
বড় ম্যাকলার্জহিউজ

17

এর মতো stripMargin(), আপনি স্ট্রিপইন্ডেন্ট () পছন্দও ব্যবহার করতে পারেন

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

কারণে

সর্বাধিক সংখ্যক শীর্ষস্থানীয় স্পেস সহ লাইনটি সরানোর জন্য সংখ্যা নির্ধারণ করে।

আপনাকে প্রথম "পরীক্ষা" ইনডেন্ট করতে হবে এবং সরাসরি ইনিটাল পরে লাগাতে হবে না """(এটি \নিশ্চিত করে যে মাল্টি-লাইনের স্ট্রিংটি একটি নতুন লাইন দিয়ে শুরু হবে না)।


2
কি জন্য?
জো ফিলিপস

4
আমি আমার শেষ বাক্যটি আরও ভালভাবে ব্যাখ্যা করার জন্য উন্নত করেছি।
sschuberth
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.