রুবি: আমি কি একযোগে ছাড়াই মাল্টি-লাইনের স্ট্রিং লিখতে পারি?


396

এই চেহারাটি আরও ভাল করার কোনও উপায় আছে কি?

conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' +
          'from table1, table2, table3, etc, etc, etc, etc, etc, ' +
          'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

মত, সংক্ষেপে বোঝানোর উপায় আছে কি?


28
এসকিউএল ইঞ্জেকশন আক্রমণ সম্পর্কে সাবধানতা অবলম্বন করুন। :)
রায় টিঙ্কার

উত্তর:


594

এই উত্তরের কয়েকটি টুকরো রয়েছে যা আমাকে যা প্রয়োজন তা পেতে সহায়তা করেছে (অতিরিক্ত শ্বেত স্পেস ব্যতিরেকে সহজ মাল্টি-লাইন কনটেন্টেশন), তবে যেহেতু প্রকৃত উত্তরগুলির কোনওটিরই এটি নেই, তাই আমি তাদের এখানে সংকলন করছি:

str = 'this is a multi-line string'\
  ' using implicit concatenation'\
  ' to prevent spare \n\'s'

=> "this is a multi-line string using implicit concatenation to eliminate spare
\\n's"

বোনাস হিসাবে, মজার HEREDOC সিনট্যাক্স ব্যবহার করে এই সংস্করণটি এখানে দেওয়া হয়েছে ( এই লিঙ্কের মাধ্যমে ):

p <<END_SQL.gsub(/\s+/, " ").strip
SELECT * FROM     users
         ORDER BY users.id DESC
END_SQL
# >> "SELECT * FROM users ORDER BY users.id DESC"

দ্বিতীয়টি বেশিরভাগ ক্ষেত্রে এমন পরিস্থিতিতে পড়বে যেগুলির প্রসেসিংয়ে আরও নমনীয়তা প্রয়োজন। আমি ব্যক্তিগতভাবে এটি পছন্দ করি না, এটি প্রসেসিংটিকে একটি অদ্ভুত স্থানে স্ট্রিং করে দেয় (অর্থাত্ এটির সামনে, তবে উদাহরণস্বরূপ পদ্ধতিগুলি সাধারণত পরে আসে) তবে এটি সেখানে। মনে রাখবেন যে আপনি যদি সর্বশেষ END_SQLশনাক্তকারীকে (যা সাধারণ, কারণ এটি সম্ভবত কোনও ফাংশন বা মডিউলের অভ্যন্তরে অন্তর্ভুক্ত করা হয়), আপনাকে হাইফেনেটেড সিনট্যাক্স ব্যবহার করতে হবে (এটি p <<-END_SQLপরিবর্তে p <<END_SQL)। অন্যথায়, ইনডেন্টিং হোয়াইটস্পেসের কারণে সনাক্তকারীটিকে স্ট্রিংয়ের ধারাবাহিকতা হিসাবে ব্যাখ্যা করা হয়।

এটি বেশি টাইপিং সংরক্ষণ করে না, তবে এটি আমার কাছে + চিহ্নগুলি ব্যবহার করার চেয়ে সুন্দর দেখায়।

এছাড়াও (আমি বেশ কয়েক বছর পরে একটি সম্পাদনায় বলি), আপনি যদি রুবি ২.৩+ ব্যবহার করেন তবে << the অপারেটরটিও পাওয়া যায় যা চূড়ান্ত স্ট্রিং থেকে অতিরিক্ত ইনডেন্টেশন সরিয়ে দেয়। আপনি .gsubঅনুরোধটি সরাতে সক্ষম হবেন , সেক্ষেত্রে (যদিও এটি প্রারম্ভিক ইন্ডেন্টেশন এবং আপনার চূড়ান্ত প্রয়োজন উভয়ের উপর নির্ভর করে)।

সম্পাদনা: আরও একটি যোগ করা হচ্ছে:

p %{
SELECT * FROM     users
         ORDER BY users.id DESC
}.gsub(/\s+/, " ").strip
# >> "SELECT * FROM users ORDER BY users.id DESC"

2
এটি একটি পুরানো প্রশ্ন তবে উত্তরটিতে একটি ত্রুটি রয়েছে বা তখন থেকেই বাক্য গঠনতে পরিবর্তন হয়েছে। p <<END_SQLহওয়া উচিত p <<-END_SQLঅন্যথায় এটি উত্তর। allyচ্ছিকভাবে আপনি স্কুইগ্লি হেরডোক অপারেটরের সাথে শীর্ষস্থানীয় সাদা স্থানটি ছিনিয়ে নিতে পারেন,<<~END_SQL
জয়দেল

এটি কেবলমাত্র ত্রুটিযুক্ত যদি শেষ শনাক্তকারীকে ইন্টেন্ট করা হয় (হাইফেন রুবি ইন্টারপ্রেটারকে শেষ শনাক্তকারী নির্ধারণের আগে সাদা বর্ণমালা ট্রিম করতে বলে)। যদিও আমি উল্লেখ করে একটি নোট রাখতে পারি। এছাড়াও, ~ অপ্রয়োজনীয়, gsub \ s + এবং স্ট্রিপ ইতিমধ্যে নেতৃস্থানীয় হোয়াইটস্পেস সরিয়ে ফেলছে।
উ। উইলসন

যোগ করা হচ্ছে <<~উত্তর চমৎকার হবে, গবেষণা যে সেখান থেকে শেষ পর্যন্ত। ব্যক্তিগতভাবে, আমি ব্যবহার করি <<~MSG.strip ... MSGযা সর্বশেষে স্ট্রিপগুলিও ফেলে \n
কোর্টেক্স

1
আমি যখন এই উত্তরটি লিখেছিলাম (নয় বছর আগে, শীশ!), রুবি ছিল 1.9-এ, এবং << ~ (স্পষ্টতই) ২.৩ অবধি পরিচয় হয় নি। যাইহোক, প্রাচীন ইতিহাস একপাশে রেখে, আমি এটিকে রাখব, এটি আনার জন্য ধন্যবাদ।
এ। উইলসন

অতিরিক্ত কয়েকটি নিউলাইন যোগ না করে এমন কয়েকটি উত্তরের একটি হওয়ার জন্য আপনাকে ধন্যবাদ , আমি যখন এই প্রশ্নটি পেয়েছি তখন আমি এড়াতে চাইছিলাম।
জোশ

174

রুবি ২.০ এ আপনি এখন ব্যবহার করতে পারেন %

উদাহরণ স্বরূপ:

SQL = %{
SELECT user, name
FROM users
WHERE users.id = #{var}
LIMIT #{var2}
}

14
রুবি 1.9.3 এও কাজ করে।
অ্যান্ডি স্টুয়ার্ট

26
এই সিনট্যাক্সের সাহায্যে তৈরি একটি স্ট্রিংয়ে উভয় নিউলাইন এবং পরবর্তী লাইনগুলিতে যে কোনও সংযোজন যুক্ত হবে।
জেমস

এটি << ইওটি ...... ইওটি (এখানে ডকুমেন্ট) এর চেয়েও ভাল! এটি প্রয়োজনে দ্বিখণ্ডিতও করে।
নাসের

1
@ নাসার এ হেরডোক এছাড়াও ইন্টারপোলেশন করে।
মনিকার লকসুইট

3
যদি squishআউটপুটটিতে অনুরোধ করা রেলগুলি ব্যবহার করা সহায়ক হয়।
জিগনেশ গোহেল

167

হ্যাঁ, আপনি যদি অতিরিক্ত নতুন লাইনগুলি প্রবেশ করানোর বিষয়ে কিছু মনে করেন না:

 conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7
            from table1, table2, table3, etc, etc, etc, etc, etc,
            where etc etc etc etc etc etc etc etc etc etc etc etc etc'

বিকল্পভাবে আপনি একটি হেরডোক ব্যবহার করতে পারেন :

conn.exec <<-eos
   select attr1, attr2, attr3, attr4, attr5, attr6, attr7
   from table1, table2, table3, etc, etc, etc, etc, etc,
   where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos

87
আপনি এটিও ব্যবহার করতে পারেন%Q(...)
বারোকোবিস্ক্যাট

3
@ জম্বি: নিউলাইনগুলি সাধারণত এসকিউএল স্টেটমেন্টে অনুমোদিত হয় এবং কেবল সাধারণ সাদা স্থান হিসাবে বিবেচিত হয়।
মার্ক বাইয়ার্স

2
উদাহরণস্বরূপ নীচে আমার উত্তরটি দেখুন, আপনি এখন% ব্যবহার করতে পারেন।
রবি গিলফয়েল

4
আপনিও ব্যবহার করতে পারেন%(...)
শুক্র-বিভাজক

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

50

আপনি ইতিমধ্যে পড়া হিসাবে মাল্টি-লাইন স্ট্রিং জন্য একাধিক বাক্য গঠন আছে। আমার প্রিয় পার্ল স্টাইল:

conn.exec %q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
      from table1, table2, table3, etc, etc, etc, etc, etc,
      where etc etc etc etc etc etc etc etc etc etc etc etc etc}

মাল্টি-লাইনের স্ট্রিংটি% q এর সাথে শুরু হয়, তার পরে একটি {, [বা (এবং তারপরে সংশ্লিষ্ট বিপরীত চরিত্র দ্বারা সমাপ্ত হয়%

conn.exec %Q{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
      from #{table_names},
      where etc etc etc etc etc etc etc etc etc etc etc etc etc}

এই ধরণের মাল্টি-লাইন স্ট্রিংগুলিকে কীভাবে বলা হয় তা আসলে আমার কোনও ধারণা নেই তাই আসুন কেবল তাদের পার্ল মাল্টিনগুলি বলি।

তবে লক্ষ্য করুন যে আপনি মার্ক এবং পিটারের পরামর্শ অনুসারে পার্ল মাল্টিলিন বা হেরিডোকগুলি ব্যবহার করুন না কেন, আপনি সম্ভাব্য অপ্রয়োজনীয় শ্বেতস্পেসে শেষ করবেন। আমার উদাহরণ এবং তাদের উদাহরণ উভয়ই, "থেকে" এবং "যেখানে" লাইনগুলিতে কোডটিতে প্রবেশের কারণে নেতৃস্থানীয় শ্বেতস্পেস থাকে p যদি এই সাদা স্থানটি পছন্দসই না হয় তবে আপনার এখন যেমন করা হচ্ছে তেমন স্ট্র্যাঙ্কগুলি অবশ্যই ব্যবহার করতে হবে।



2
এই শিরাতে আমার প্রিয়টি কেবলমাত্র% inter ইন্টারপোলেশন সমর্থন সহ সুপার মাল্টলাইন স্ট্রিং is
ডিউক

%qপরিবার থেকে উত্পাদিত স্ট্রিংগুলিতে নিউলাইনগুলি অন্তর্ভুক্ত থাকবে যা মূল কোডের সাথে সমান নয়।
জোশ

29

কখনও কখনও নতুন লাইনের অক্ষরগুলি মুছে ফেলার \nমতো মূল্য :

conn.exec <<-eos.squish
 select attr1, attr2, attr3, attr4, attr5, attr6, attr7
 from table1, table2, table3, etc, etc, etc, etc, etc,
 where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos

5
এটি রুবি ভিত্তিক রেল নয়
14 মি

23

আপনি ডাবল উদ্ধৃতিও ব্যবহার করতে পারেন

x = """
this is 
a multiline
string
"""

2.3.3 :012 > x
 => "\nthis is\na multiline\nstring\n"

লাইন ব্রেকগুলি সরানোর প্রয়োজন হলে প্রতিটি লাইনের শেষে "\" ব্যাকস্ল্যাশ ব্যবহার করুন


5
আপনি একক একক ডাবল উদ্ধৃতি দিয়ে একই ফলাফল অর্জন করতে পারেন। রুবিতে ট্রিপল ডাবল কোটের মতো কোনও জিনিস নেই। এটি কেবল তাদের হিসাবে ব্যাখ্যা করে "" + "double quotes with some content" + ""
রকভিয়াম

হ্যাঁ, তবে `" "+" \ n হ্যালো \ n "+" "কি অদ্ভুত দেখাচ্ছে
জুলিয়ানগনজালেজ

1
হ্যাঁ, এটি অদ্ভুত দেখাচ্ছে, এবং এ কারণেই অতিরিক্ত ডাবল উক্তি যুক্ত করার কোনও কারণ নেই যখন আপনি কেবল একই ফলাফলের সাথে একক ডাবল উদ্ধৃতি ব্যবহার করতে পারেন।
রকভিয়াম

হ্যাঁ, আমি প্লাস চিহ্নটি বোঝাতে চাইছিলাম। এটি ছাড়া ডাবল উদ্ধৃতিগুলি কেবল সূক্ষ্ম দেখায়, এটির পাঠযোগ্য এবং একক উদ্ধৃতির পরিবর্তে স্পট করা সহজ, যা একক লাইনের স্ট্রিংয়ে ব্যবহার করা উচিত।
জুলিয়ানগনজালেজ

1
আমি বোঝাতে চাইছি যে কেবল "x"আরও ভাল দেখায় এবং """x"""(যা মূলত একই রকম ""+"x"+"") বা """""x"""""(যা একই হিসাবে ) এর চেয়ে দ্রুত কাজ করে "" + "" + "x" + "" + ""। এটি রুবি, পাইথন নয়, যেখানে আপনাকে মাল্টি-লাইন স্ট্রিংয়ের প্রয়োজন হয় তার """পরিবর্তে আপনি ব্যবহার করেন "
রকভিয়াম

15
conn.exec = <<eos
  select attr1, attr2, attr3, attr4, attr5, attr6, attr7
  from table1, table2, table3, etc, etc, etc, etc, etc,
  where etc etc etc etc etc etc etc etc etc etc etc etc etc
eos

1
'<< - ইওস' হিসাবে '-' ছাড়াই হেরডোক ব্যবহার করে অতিরিক্ত নেতার স্পেস অন্তর্ভুক্ত করা হবে। মার্ক বাইয়ার্সের প্রতিক্রিয়া দেখুন।
iv

হেরডোক নতুন লাইনগুলি অন্তর্ভুক্ত করবে যা মূল কোডের সমতুল্য নয়।
জোশ

15

অন্যান্য অপশন:

#multi line string
multiline_string = <<EOM
This is a very long string
that contains interpolation
like #{4 + 5} \n\n
EOM

puts multiline_string

#another option for multiline string
message = <<-EOF
asdfasdfsador #{2+2} this month.
asdfadsfasdfadsfad.
EOF

puts message

1
পরিবর্তন <<EOMকরা উচিত <<-EOM, না?
কিংপ্পি

হতে পারে, এটি আমার <<-EOFউদাহরণের জন্য কাজ করেছে বলে মনে হয়েছিল । আমার অনুমান যে কোনওভাবেই কাজ করে।
অ্যালেক্স কোহেন

হেরডোক নতুন লাইনগুলি অন্তর্ভুক্ত করবে যা মূল কোডের সমতুল্য নয়।
জোশ

11

সম্প্রতি রুবি ২.৩-এ নতুন বৈশিষ্ট্য সহ নতুন squiggly HEREDOCআপনাকে একটি ন্যূনতম পরিবর্তন সহ একটি সুন্দর পদ্ধতিতে আমাদের মাল্টলাইন স্ট্রিংগুলি লিখতে দেবে .squish(যদি আপনি রেল ব্যবহার করছেন) এর সাথে একত্রিত হয়ে এটি আপনাকে একটি ভাল উপায়ে মাল্টলাইন লিখতে দেবে! কেবল রুবি ব্যবহারের ক্ষেত্রে আপনি এমনটি করতে পারেন <<~SQL.split.join(" ")যা প্রায় একই রকম

[1] pry(main)> <<~SQL.squish
[1] pry(main)*   select attr1, attr2, attr3, attr4, attr5, attr6, attr7
[1] pry(main)*   from table1, table2, table3, etc, etc, etc, etc, etc,
[1] pry(main)*   where etc etc etc etc etc etc etc etc etc etc etc etc etc
[1] pry(main)* SQL
=> "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 from table1, table2, table3, etc, etc, etc, etc, etc, where etc etc etc etc etc etc etc etc etc etc etc etc etc"

রেফ: https://infinum.co/the-capsized-eight/m Multilineline-strings-ruby-2-3-3-0-the-squiggly- heredoc


স্কোয়াশ হ'ল রেল, রুবি নয়
জোশ

1
@ জোশ, হ্যাঁ আপনি ঠিক বলেছেন, উত্তর আপডেট করেছেন, চিয়ার্স।
মার্ক জ্যাড

6
conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' <<
        'from table1, table2, table3, etc, etc, etc, etc, etc, ' <<
        'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

<< স্ট্রিংগুলির জন্য কনকনেটেশন অপারেটর


2
+হ'ল নিয়মিত কনটেনটেশন অপারেটর, <<হ'ল ইন-প্লেস অ্যাপেন্ড অপারেটর। আক্ষরিক উপর পার্শ্ব প্রতিক্রিয়া ব্যবহার এখানে কাজ করতে ঘটে (প্রথম স্ট্রিং দুইবার সংশোধন করে ফিরে আসে) কিন্তু IMHO এটি অদ্ভুত এবং আমাকে ডাবল-টেক করতে দেয়, যেখানে +পুরোপুরি স্পষ্ট হবে। তবে সম্ভবত আমি রুবির কাছে কেবল নতুন ...
বেনি চেরনিয়াভস্কি-পাসকিন

frozen_string_literalসক্ষম করা থাকলে এটি কাজ করবে না
রাইদো

6

আপনি যদি না মন অতিরিক্ত স্পেস এবং নতুন লাইন, আপনি ব্যবহার করতে পারেন

conn.exec %w{select attr1, attr2, attr3, attr4, attr5, attr6, attr7
  from table1, table2, table3, etc, etc, etc, etc, etc,
  where etc etc etc etc etc etc etc etc etc etc etc etc etc} * ' '

(ইন্টারপোল্টেড স্ট্রিংয়ের জন্য% W ব্যবহার করুন)


আমি এটি খুব পছন্দ করি কারণ এটি ব্যবহারের আরও সংমিশ্রণের অনুমতি দেয়।
schmijos

1
এটি একাধিক সংলগ্ন স্থানগুলিকে এক করে স্কোয়াশ করবে। (এর নিউলাইন + নিম্নোক্ত ইনডেন্টেশনের স্কোচিং এখানে একটি জয় তবে লাইনের মাঝে এটি আশ্চর্যজনক হতে পারে।)
বেনি চেরনিয়াভস্কি-পাসকিন

5

প্রতিটি লাইনের জন্য প্রথম বন্ধনী বন্ধ করা এড়াতে আপনি নিউলাইন থেকে বাঁচতে কেবল ব্যাকস্ল্যাশ দিয়ে ডাবল উদ্ধৃতি ব্যবহার করতে পারেন:

"select attr1, attr2, attr3, attr4, attr5, attr6, attr7 \
from table1, table2, table3, etc, etc, etc, etc, etc, \
where etc etc etc etc etc etc etc etc etc etc etc etc etc"

এটি এই পৃষ্ঠার কয়েকটি উত্তরগুলির মধ্যে একটি যা আসলে প্রশ্নের উত্তর দেয়!
জোশ

4
conn.exec [
  "select attr1, attr2, attr3, ...",
  "from table1, table2, table3, ...",
  "where ..."
].join(' ')

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


@ আইডান, আপনি কমাগুলি ব্যাকস্ল্যাশ (একটি লা সি) দিয়ে প্রতিস্থাপন করতে পারবেন এবং কোনও যোগ (বা অ্যারে) লাগবে না: অনুবাদক প্যারস সময় (তারপরে) স্ট্রিংগুলি সংহত করবেন এবং বেশিরভাগ বিকল্পের তুলনায় এটি বেশ দ্রুত তৈরি করবেন । স্ট্রিংগুলির একটি অ্যারেতে যোগদানের একটি সুবিধা হ'ল কিছু অটো-ইনডেন্টাররা তাদের চেয়ে আরও ভাল কাজ করে, উদাহরণস্বরূপ, এখানে-ডক স্ট্রিং বা with দিয়ে \
ওয়েইন কনরাড

1
একটি নোট, হেরডোক সিনট্যাক্স << - উপযুক্ত ইনডেন্টেশন অনুমতি দেবে।
উ। উইলসন

2

রুবি ২.৩ থেকে রুবি-ওয়ে (টিএম): নিউলাইন এবং সঠিক পরিচয় সহ বহু-লাইন স্ট্রিং সংজ্ঞায়িত করতে স্কুইগ্লি হারডোক ব্যবহার করুন <<~:

conn.exec <<~EOS
            select attr1, attr2, attr3, attr4, attr5, attr6, attr7
            from table1, table2, table3, etc, etc, etc, etc, etc
            where etc etc etc etc etc etc etc etc etc etc etc etc etc
          EOS

# -> "select...\nfrom...\nwhere..."

যথাযথ সনাক্তকরণ যদি উদ্বেগের বিষয় না হয় তবে একক এবং ডাবল উদ্ধৃতিগুলি রুবিতে একাধিক লাইন বিস্তৃত করতে পারে:

conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 
           from table1, table2, table3, etc, etc, etc, etc, etc, 
           where etc etc etc etc etc etc etc etc etc etc etc etc etc"    

# -> "select...\n           from...\n           where..."

যদি একক বা ডাবল উদ্ধৃতিগুলি জটিল হয় কারণ এর জন্য প্রচুর পালানোর দরকার পড়ে, তবে শতাংশ স্ট্রিং আক্ষরিক স্বরলিপিটি %সবচেয়ে নমনীয় সমাধান:

conn.exec %(select attr1, attr2, attr3, attr4, attr5, attr6, attr7
            from table1, table2, table3, etc, etc, etc, etc, etc
            where (ProductLine = 'R' OR ProductLine = "S") AND Country = "...")
# -> "select...\n            from...\n            where..."

যদি লক্ষ্য হয় যে নিউলাইনগুলি এড়িয়ে চলুন (যা স্কুইগলি হারডোক, কোটস এবং শতাংশ স্ট্রিং আক্ষরিক উভয়ই ঘটায়) তবে সর্বশেষ অ-হোয়াইটস্পেস অক্ষর হিসাবে একটি ব্যাকস্ল্যাশ লাইনটি অবিরত রাখবে এবং রুবি স্ট্রিংগুলিকে পিছনে পিছনে সংহত করতে বাধ্য করবে will (উদ্ধৃত স্ট্রিংয়ের ভিতরে থাকা সেই জায়গাগুলি সন্ধান করুন):

conn.exec 'select attr1, attr2, attr3, attr4, attr5, attr6, attr7 ' \
          'from table1, table2, table3, etc, etc, etc, etc, etc, ' \
          'where etc etc etc etc etc etc etc etc etc etc etc etc etc'

# -> "select...from...where..."

আপনি যদি রেলগুলি ব্যবহার করেন String.squishতবে শীর্ষস্থানীয় এবং পিছনের স্থানের স্ট্রিংটি কেটে ফেলবে এবং একটানা সমস্ত টানা সাদা স্থান (নিউলাইনস, ট্যাব এবং সমস্ত) একসাথে ফাঁকা করে দেবে:

conn.exec "select attr1, attr2, attr3, attr4, attr5, attr6, attr7 
           from table1, table2, table3, etc, etc, etc, etc, etc, 
           where etc etc etc etc etc etc etc etc etc etc etc etc etc".squish

# -> "select...from...where..."

আরো বিস্তারিত:

রুবি হারডোক সিনট্যাক্স

স্ট্রিংসের কাজের জন্য এখানে নথি নোটেশন কোডে টেক্সট ইনলাইনের দীর্ঘ ব্লকগুলি নির্দিষ্ট করার একটি উপায়। এটি <<ব্যবহারকারী-সংজ্ঞায়িত স্ট্রিং (স্ট্রিং টার্মিনেটরের সমাপ্তি) এর পরে শুরু হয়। স্ট্রিং টার্মিনেটরের সমাপ্তি একটি লাইনের একেবারে প্রারম্ভিক অবধি পাওয়া না যাওয়া পর্যন্ত নিম্নলিখিত সমস্ত লাইন সংক্ষিপ্ত হয়ে থাকে:

puts <<HEREDOC 
Text Text Text Text
Bla Bla
HEREDOC
# -> "Text Text Text Text\nBlaBla"

স্ট্রিং টার্মিনেটরের শেষ অবধি অবাধে নির্বাচন করা যেতে পারে তবে "EOS" (স্ট্রিংয়ের সমাপ্তি) জাতীয় কিছু বা স্ট্রিংয়ের ডোমেনের সাথে মেলে এমন কিছু ব্যবহার করা যেমন "এসকিউএল" ব্যবহার করা সাধারণ common

HEREDOC সমর্থন ক্ষেপক ডিফল্টরূপে অথবা যখন ইওএস টারমিনেটর ডবল উদ্ধৃত করা হয়:

price = 10
print <<"EOS"  # comments can be put here
1.) The price is #{price}.
EOS
# -> "1.) The price is 10."

ইওএস টার্মিনেটরটি একক উদ্ধৃত হলে ইন্টারপোলেশন অক্ষম করা যেতে পারে:

print <<'EOS' # Disabled interpolation
3.) The price is #{price}.
EOS
# -> "3.) The price is #{price}."

এর একটি গুরুত্বপূর্ণ সীমাবদ্ধতা <<HEREDOCহ'ল স্ট্রিং টার্মিনেটরের সমাপ্তিটি লাইনের শুরুতে হওয়া দরকার:

  puts <<EOS 
    def foo
      print "foo"
    end
  EOS
EOS
#-> "....def foo\n......print "foo"\n....end\n..EOS

এটি প্রায় পেতে <<-সিনট্যাক্স তৈরি করা হয়েছিল। কোডটি আরও সুন্দর দেখানোর জন্য এটি ইওএস টার্মিনেটরকে ইন্টেন্টেড হতে দেয়। <<-EOS টার্মিনেটরের মধ্যে থাকা লাইনগুলি এখনও সমস্ত ইনডেন্টেশন সহ তাদের পূর্ণ বর্ধনে ব্যবহৃত হয়:

puts <<-EOS # Use <<- to indent End of String terminator
  def foo
    print "foo"
  end
EOS
# -> "..def foo\n....print "foo"\n..end"

রুবি ২.৩ থেকে, আমাদের এখন স্কুইগলি হেরডোক <<~শীর্ষস্থানীয় সাদা স্থান সরিয়ে দিয়েছে:

puts <<~EOS # Use the squiggly HEREDOC <<~ to remove leading whitespace (since Ruby 2.3!)
  def foo
    print "foo"
  end
EOS
# -> "def foo\n..print "foo"\nend"

খালি লাইন এবং লাইনগুলিতে কেবলমাত্র ট্যাব এবং স্থান রয়েছে << ~ দ্বারা উপেক্ষা করা হবে ~

puts <<~EOS.inspect 
  Hello

    World!
EOS
#-> "Hello\n..World!"

যদি ট্যাব এবং স্পেস উভয়ই ব্যবহৃত হয় তবে ট্যাবগুলি 8 টি স্পেসের সমান হিসাবে বিবেচিত হবে। যদি সর্বনিম্ন-অভিযুক্ত লাইনটি কোনও ট্যাবের মাঝখানে থাকে তবে এই ট্যাবটি সরানো হবে না।

puts <<~EOS.inspect
<tab>One Tab
<space><space>Two Spaces
EOS
# -> "\tOne Tab\nTwoSpaces"

হারডোক ব্যাকটিকস ব্যবহার করে কমান্ড কার্যকর করতে যেমন কিছু ক্রেজি জিনিস করতে পারে:

puts <<`EOC`            
echo #{price}
echo #{price * 2}
EOC

হারডোক স্ট্রিং সংজ্ঞাগুলি "স্ট্যাকড" হতে পারে, যার অর্থ প্রথম EOS টার্মিনেটর (নীচে EOSFOO) প্রথম স্ট্রিংটি শেষ করবে এবং দ্বিতীয়টি (নীচে EOSBAR) শুরু করবে:

print <<EOSFOO, <<EOSBAR    # you can stack them
I said foo.
EOSFOO
I said bar.
EOSBAR

আমি মনে করি না যে এটির মতো কেউ কখনও ব্যবহার করবে, তবে এটি <<EOSসত্যই কেবল একটি স্ট্রিং আক্ষরিক এবং যেখানেই স্ট্রিংটি সাধারণত রাখা যেতে পারে:

def func(a,b,c)
  puts a
  puts b
  puts c
end

func(<<THIS, 23, <<THAT) 
Here's a line
or two.
THIS
and here's another.
THAT

আপনার কাছে রুবি ২.৩ না থাকলেও রেল >=3.0.০ থাকে তবে আপনি String.strip_heredocযা ব্যবহার করতে পারেন তা একই রকম হয়<<~

# File activesupport/lib/active_support/core_ext/string/strip.rb, line 22
class String
  def strip_heredoc
    gsub(/^#{scan(/^[ \t]*(?=\S)/).min}/, "".freeze)
  end
end

puts <<-USAGE.strip_heredoc # If no Ruby 2.3, but Rails >= 3.0
  This command does such and such.

  Supported options are:
    -h         This message
    ...
USAGE

শতকরা স্ট্রিং লিটারালস

দেখুন RubyDoc কিভাবে এই ধরনের একটি হিসাবে একটি প্রথম বন্ধনী জোড়ায় একটি স্ট্রিং দ্বারা শতাংশ চিহ্ন অনুসৃত ব্যবহার করার জন্য %(...), %[...],%{...} বা ইত্যাদি যেমন কোনো অ-আলফানিউমেরিক অক্ষর একজোড়া%+...+

শেষ কথা

সর্বশেষে, মূল প্রশ্নের উত্তর পেতে "কি বোঝানোর কোনও উপায় আছে?" উত্তর: রুবি সর্বদা সংক্ষেপে বোঝায় যদি দুটি স্ট্রিং (একক এবং ডাবল উদ্ধৃত) ফিরে পাওয়া যায় তবে:

puts "select..." 'from table...' "where..."
# -> "select...from table...where..."

সাবধানবাণীটি হ'ল এটি লাইন ব্রেকগুলি জুড়ে কাজ করে না, কারণ রুবি বিবৃতিটির শেষের ব্যাখ্যা দিচ্ছে এবং কেবল একটি লাইনে কেবল স্ট্রিংয়ের ফলস্বরূপ লাইন কিছুই করে না।


1

মার্জিত উত্তর আজ:

<<~TEXT
Hi #{user.name}, 

Thanks for raising the flag, we're always happy to help you.
Your issue will be resolved within 2 hours.
Please be patient!

Thanks again,
Team #{user.organization.name}
TEXT

এর মধ্যে একটি পার্থক্য রয়েছে <<-TEXTএবং <<~TEXTপ্রাক্তন ব্লকের ভিতরে ব্যবধান বজায় রাখে এবং শেষেরটি তা করে না।

এছাড়াও অন্যান্য বিকল্প আছে। সংক্ষিপ্তকরণ ইত্যাদি পছন্দ করে তবে এটি সাধারণভাবে আরও বেশি বোঝায়।

আমি যদি এখানে ভুল হয়ে থাকি তবে আমাকে কীভাবে ...


হেরডোক নতুন লাইনগুলি অন্তর্ভুক্ত করবে যা মূল কোডের সমতুল্য নয়।
জোশ

1

আপনার মতো, আমি এমন একটি সমাধানও খুঁজছিলাম যাতে নতুন লাইন অন্তর্ভুক্ত না । (যদিও তারা এসকিউএল এ নিরাপদে থাকতে পারে তবে তারা আমার ক্ষেত্রে নিরাপদ নয় এবং এর সাথে মোকাবিলা করার জন্য আমার কাছে একটি বিশাল টেক্সট রয়েছে)

এটি তর্কসাপেক্ষভাবে ঠিক কুৎসিত, তবে ফলস্বরূপ স্ট্রিং থেকে বাদ দিতে আপনি একটি বংশানুক্রমে নিউলাইনগুলিকে ব্যাকস্ল্যাশ-এ্যাস্ক করতে পারেন:

conn.exec <<~END_OF_INPUT
    select attr1, attr2, attr3, attr4, attr5, attr6, attr7 \
    from table1, table2, table3, etc, etc, etc, etc, etc, \
    where etc etc etc etc etc etc etc etc etc etc etc etc etc
  END_OF_INPUT

মনে রাখবেন যে আপনি বিরতি (IE <<~'END_OF_INPUT') ছাড়াই এটি করতে পারেন না তাই সাবধান হন। #{expressions}এখানে মূল্যায়ন করা হবে, যদিও এগুলি আপনার মূল কোডে থাকবে না। উ: উইলসনের উত্তর সে কারণেই ভাল হতে পারে।

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