নতুন লাইনগুলি না কেটে রুবিতে একাধিক লাইনে দীর্ঘ স্ট্রিং ব্রেক করা


221

আমরা সম্প্রতি আমার কাজটিতে একটি রুবি স্টাইল গাইডের সিদ্ধান্ত নিয়েছি। এর মধ্যে একটি হ'ল 80 টি অক্ষরের চেয়ে কোনও লাইন প্রশস্ত হওয়া উচিত নয়। যেহেতু এটি একটি রেলস প্রকল্প, আমাদের প্রায়শই স্ট্রিংগুলি কিছুটা দীর্ঘ হয় - যেমন " ব্যবহারকারী এক্স আপনাকে থিং ওয়াই সম্পর্কে একটি বার্তা প্রেরণ করতে চেয়েছিল " যা 80 অক্ষরের শৈলীর সীমাতে সর্বদা ফিট হয় না।

আমি বুঝতে পারি যে দীর্ঘ স্ট্রিং স্প্যানের একাধিক লাইন থাকার তিনটি উপায় রয়েছে:

  • HEREDOC
  • % প্রশ্ন {}
  • আসল স্ট্রিং কনটেনটেশন।

যাইহোক, এই সমস্ত ক্ষেত্রে আরও গণনা চক্র গ্রহণ শেষ হয়, যা নির্বোধ বলে মনে হয়। স্পষ্টতই স্ট্রিং কনটেনটেশন, তবে এর জন্য HEREDOCএবং %Qআমাকে নতুন লাইনের সন্ধান করতে হবে, এরকম কিছু মাধ্যমে .gsub(/\n$/, '')

এটি করার কোনও বিশুদ্ধ বাক্য গঠন আছে, এটি কেবল একটি লাইনে পুরো স্ট্রিং থাকার সমতুল্য? লক্ষ্যটি হ'ল স্পষ্টতই, কোনও অতিরিক্ত চক্র ব্যয় না করা, কারণ আমি চাইছি আমার কোডটি আরও পড়ুন। (হ্যাঁ, আমি বুঝতে পেরেছি যে আপনাকে সেই ট্রেডফোকটি অনেকটা করতে হবে ... তবে স্ট্রিং দৈর্ঘ্যের জন্য এটি কেবল নির্বোধ বলে মনে হয়))

আপডেট: ব্যাকস্ল্যাশগুলি ঠিক আমি যা চাই তা নয় কারণ আপনি ইন্ডেন্টেশন হারাচ্ছেন, যা সত্যই স্টাইল / পঠনযোগ্যতাকে প্রভাবিত করে।

উদাহরণ:

if foo
  string = "this is a \  
string that spans lines"  
end

আমি উপরেরটি পড়তে কিছুটা কঠিন মনে করি।

সম্পাদনা : আমি নীচে একটি উত্তর যুক্ত করেছি; তিন বছর পরে আমাদের এখন স্কুইগ্লি হেরিডোক।


এই স্ট্রিংগুলি ফ্যাক্ট করতে আপনার পক্ষে মূল্যবান হতে পারে।
চিজমিস্টার


You আপনি \nনতুন লাইনের চরিত্র রাখতে চান কিনা তা অস্পষ্ট । শীর্ষের উত্তর সেগুলি রাখে না — তবুও আপনার উত্তরটি তা করে। প্রশ্নটি "নতুন লাইনের স্ট্রাইপ না করে" বলছে - বর্ণনাটিতে "[...] আমাকে নতুন লাইনগুলি সরিয়ে ফেলতে হবে"।
ব্রায়ান ডিমাস

উত্তর:


432

আপনি এটি কি খুঁজছেন হতে পারে?

string = "line #1"\
         "line #2"\
         "line #3"

p string # => "line #1line #2line #3"

4
হাহ। হ্যাঁ, এটা বেশ নিখুঁত। এটি কি আসলে ফণার নীচে একটি কনসেটেট করছে? (একটি + লুকিয়ে?)
chug2k

13
আমি মোটামুটি নিশ্চিত যে এটি না; আমি স্ট্রিং # + কে অপরিবর্তিত এবং পুনরায় সংজ্ঞায়িত করার চেষ্টা করেছি এবং দেখে মনে হচ্ছে সেখানে কিছু পাঠানো হচ্ছে না।
জেসেজেজ

এছাড়াও একই লাইনে স্ট্রিং একে অপরের পাশে রাখাও কাজ করে তবে এটি খুব কার্যকর নয়।
জেসেজেজ

3
আমিও এমিলির সমাধান পছন্দ করি। তবে কোনও কারণে আমি এইটির সাথে আরও স্বাচ্ছন্দ্যবোধ করি কারণ নিম্নলিখিত লাইনে শীর্ষস্থানীয় শ্বেতস্থানগুলি নিজেকে দ্বিতীয়-অনুমান না করে ইন্টেন্ট করা যেতে পারে।
আমিন আরিয়ানা

5
পুনরায় যুক্তিযুক্ত, এই সম্পর্কিত প্রশ্নের জন্য আমদানার উত্তর দেখুন । তিনি বাইটকোড ব্যবহার করে প্রমাণ করেছেন যে এটি স্ট্র্যাটেটিং স্ট্রিং নয় বরং সেগুলিকে দীর্ঘতর হিসাবে বিবেচনা করে।
টম হুন্ড

55

আপনি \নির্দেশ করতে ব্যবহার করতে পারেন যে রুবির কোনও লাইন পরবর্তী লাইনে অব্যাহত রয়েছে। এটি স্ট্রিংগুলির সাথেও কাজ করে:

string = "this is a \
string that spans lines"

puts string.inspect

আউটপুট হবে "this is a string that spans lines"


11
হাহ। এটা বেশ সহজ। ভাল, এটি জিজ্ঞাসা করার জন্য সম্ভবত খুব বেশি, কিন্তু আমি পরের লাইনটি ইনডেন্ট করতে পারি না। এটি আদর্শ হতে যদি আমি এটি সমান চিহ্নের সাথে মিলে যেতে পারি।
chug2k

5
দ্রষ্টব্য: সেই ব্যাকস্ল্যাশের পরে আপনার কোনও সাদা স্থান থাকতে পারে না। এটি অবশ্যই শেষ চরিত্র হতে হবে।
জুলিয়ান মান

3
উত্তর @ জেজেহ্জের দ্বারা দেখুন। যথাযথ ইনডেন্টিং সহ সুন্দরভাবে ফর্ম্যাট কোড দেওয়ার উপায় হ'ল প্রতিটি লাইনকে উদ্ধৃতি দেওয়া।
অরর্ড

36

তিন বছর পরে, রুবি ২.৩ এ এখন একটি সমাধান রয়েছে: স্কুইগ্লি হেরিডোক।

class Subscription
  def warning_message
    <<~HEREDOC
      Subscription expiring soon!
      Your free trial will expire in #{days_until_expiration} days.
      Please update your billing information.
    HEREDOC
  end
end

ব্লগ পোস্ট লিঙ্ক: https://infinum.co/the-capsized-eight/articles/m Multilineline-strings-ruby-2-3-0-the-squiggly- heredoc

অন্ততপরিবর্তিত লাইনের ইন্ডেন্টেশন সামগ্রীটির প্রতিটি লাইন থেকে সরানো হবে।


29
অন্য যে কেউ ভাবছেন: <<~HEREDOCনিউলাইন চরিত্রগুলি রাখে, এটি কেবল ইনডেন্টেশন থেকে রাইড করে। উদাline 1\nline 2\nline 3\n
ব্রায়ান ডিমাস

1
স্ট্রাইপিং নিউলাইনগুলি এখনও অতিরিক্ত গণনা প্রয়োজন, যদিও, ওপি সাজানো যেমন সাজানো পছন্দসই ছিল না।
হেনরেবোথা

1
@ এনেরেবোথা হ্যাঁ, তবে ওপি আরও স্পষ্টভাবে বলেছে যে তারা "কেবল একটি লাইনে পুরো স্ট্রিং রাখার সমতুল্য" চায়, যার জন্য কোনও নতুন লাইনের প্রয়োজন হবে না।
নিক 15

সুতরাং আপনি আপনার প্রশ্নে স্পষ্ট করে বলেছিলেন যে আপনি কোনও হেরডোক ব্যবহার করতে চান না এবং নতুন লাইনগুলি বের করতে হবে। আপনার উত্তর এখানে উত্তরাধিকারসূত্রে ব্যবহার করে এবং এটি "পোস্ট-প্রসেসিং" দরকার যা আপনি এড়াতে চেয়েছিলেন।
ল্যামন্ট

17

আমি যখন খুব দীর্ঘ ইউআরএল লেখার চেষ্টা করি তখন আমার এই সমস্যা হয়েছিল, নিম্নলিখিত কাজগুলি।

image_url = %w(
    http://minio.127.0.0.1.xip.io:9000/
    bucket29/docs/b7cfab0e-0119-452c-b262-1b78e3fccf38/
    28ed3774-b234-4de2-9a11-7d657707f79c?
    X-Amz-Algorithm=AWS4-HMAC-SHA256&
    X-Amz-Credential=ABABABABABABABABA
    %2Fus-east-1%2Fs3%2Faws4_request&
    X-Amz-Date=20170702T000940Z&
    X-Amz-Expires=3600&X-Amz-SignedHeaders=host&
    X-Amz-Signature=ABABABABABABABABABABAB
    ABABABABABABABABABABABABABABABABABABA
).join

দ্রষ্টব্য, ইউআরএল স্ট্রিংটি তৈরি হওয়ার পরে কোনও নতুন লাইন, সাদা স্পেস থাকতে হবে না। আপনি যদি নতুন লাইনগুলি চান, তবে HEREDOC ব্যবহার করুন।

এখানে আপনার প্রতিটি পংক্তিতে খাঁটি কোট এবং ব্যাকস্ল্যাশ ছাড়াই পঠনযোগ্যতা, পরিবর্তনের স্বাচ্ছন্দ্যের इंडেন্টেশন রয়েছে। স্ট্রিংগুলিতে যোগদানের ব্যয়টি নগণ্য হওয়া উচিত।


10

আমি জ্যাকের উত্তরটি সংশোধন করেছি যেহেতু আমি স্পেস এবং ইন্টারপোলেশন চাইছিলাম কিন্তু নতুন লাইনগুলি না এবং ব্যবহার করেছি:

%W[
  It's a nice day "#{name}"
  for a walk!
].join(' ')

যেখানে name = 'fred'এটি উত্পাদন করেIt's a nice day "fred" for a walk!

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