रूबी: क्या मैं बिना किसी सहमति के मल्टी-लाइन स्ट्रिंग लिख सकता हूं?


397

क्या इस तरीके को थोड़ा बेहतर बनाने का कोई तरीका है?

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
SQL इंजेक्शन हमलों के बारे में सावधान रहें। :)
रॉय टिंकर

जवाबों:


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)। अन्यथा, इंडेंटिंग व्हाट्सएप पहचानकर्ता को स्ट्रिंग की निरंतरता के रूप में व्याख्या करने का कारण बनता है।

यह बहुत टाइपिंग को नहीं बचाता है, लेकिन यह मेरे लिए + संकेतों का उपयोग करने की तुलना में अच्छा लग रहा है।

इसके अलावा (मैं एक संपादन में कहता हूं, कई साल बाद), अगर आप रूबी 2.3+ का उपयोग कर रहे हैं, तो ऑपरेटर << ~ भी उपलब्ध है , जो अंतिम स्ट्रिंग से अतिरिक्त इंडेंटेशन को हटा देता है। आपको .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। वैकल्पिक रूप से आप स्क्विगली HEREDOC ऑपरेटर के साथ प्रमुख व्हाट्सएप उतार सकते हैं,<<~END_SQL
jaydel

यह केवल एक त्रुटि है यदि अंतिम पहचानकर्ता इंडेंटेड है (हाइफ़न रूबी दुभाषिया को अंतिम पहचानकर्ता निर्धारण करने से पहले व्हॉट्सएप ट्रिम करने के लिए कहता है)। मैं एक नोट का उल्लेख कर सकता हूं, हालांकि। इसके अलावा, ~ अनावश्यक है, gsub \ s + और पट्टी पहले से ही प्रमुख व्हाट्सएप को हटा रही है।
ए। विल्सन

<<~जवाब में जोड़ना अच्छा होगा, वहाँ से शोध समाप्त किया। व्यक्तिगत रूप से, मैं उपयोग <<~MSG.strip ... MSGकरता हूं जो अंतिम भी छीनता है \n
क्यूर्टेक्स

1
जब मैंने यह उत्तर (नौ साल पहले, शीश!) लिखा था, रूबी 1.9 पर थी, और << ~ (जाहिर है) को 2.3 के साथ पेश नहीं किया गया था। वैसे भी, प्राचीन इतिहास एक तरफ, मैं इसे अंदर लाऊंगा, इसे ऊपर लाने के लिए धन्यवाद।
ए। विल्सन

कुछ जवाबों में से एक होने के लिए धन्यवाद , जो अतिरिक्त newlines नहीं जोड़ता है, जो कि जब मैं इस प्रश्न को पाया तो मैं बचने की कोशिश कर रहा था।
जोश

174

रूबी 2.0 में आप अभी उपयोग कर सकते हैं %

उदाहरण के लिए:

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

14
रूबी 1.9.3 में भी काम करता है।
एंडी स्टीवर्ट

26
इस सिंटैक्स के साथ बनाई गई एक स्ट्रिंग में नई लाइनें और बाद के लाइनों में जोड़ा गया कोई भी इंडक्शन शामिल होगा।
जेम्स

यह << EOT ...... EOT (यहाँ दस्तावेज़) से भी बेहतर है! यदि आवश्यक हो तो यह प्रक्षेप भी करता है।
नासिर

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(...)
Baroquebuscat

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 से शुरू होता है, उसके बाद {, [या (और फिर उलटा वर्ण द्वारा समाप्त किया जाता है।% q) प्रक्षेप की अनुमति नहीं देता;% 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}

मुझे वास्तव में पता नहीं है कि इस प्रकार के मल्टी-लाइन स्ट्रिंग्स को कैसे कहा जाता है, तो चलो बस उन्हें पर्ल मल्टीलाइन कहते हैं।

ध्यान दें कि क्या आप पर्ल मल्टीलाइन या हेरेडोक्स का उपयोग करते हैं जैसा कि मार्क और पीटर ने सुझाव दिया है, आप संभावित अनावश्यक व्हाट्सएप के साथ समाप्त करेंगे। मेरे उदाहरण और उनके उदाहरण दोनों में, "से" और "जहां" लाइनों में कोड में उनके इंडेंटेशन के कारण अग्रणी व्हाट्सएप हैं। यदि यह व्हाट्सएप वांछित नहीं है, तो आप अविकसित तारों का उपयोग करें जैसा कि आप अभी कर रहे हैं।


4
# {table_names} से इस उदाहरण में काम नहीं होगा, जैसा कि आपने% q {} का उपयोग किया है, यह काम करेगा यदि आप% q [] या () का उपयोग करते हैं
मैथ्यूफोर्ड

2
इस नस में मेरा पसंदीदा सिर्फ% {इंटरपोलेशन सपोर्ट के साथ सुपर मल्टीलाइन स्ट्रिंग}
ड्यूक

%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
यह रेल रूबी नहीं आधारित है
a14m

23

आप दोहरे उद्धरण चिह्नों का भी उपयोग कर सकते हैं

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

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

यदि पंक्ति विराम को हटाने की आवश्यकता हो, तो प्रत्येक पंक्ति के अंत में "\ n" बैकस्लैश "\" का उपयोग करें


5
आप एकल दोहरे उद्धरण चिह्नों के साथ एक ही परिणाम प्राप्त कर सकते हैं। रूबी में ट्रिपल डबल कोट्स जैसी कोई चीज नहीं है। यह सिर्फ उनकी व्याख्या करता है "" + "double quotes with some content" + ""
राकविम '’

हाँ, लेकिन `" "+" \ n नमस्ते \ n "+" "अजीब लगता है
juliangonzalez

1
हां, यह अजीब लगता है, और यही कारण है कि अतिरिक्त दोहरे उद्धरण जोड़ने का कोई कारण नहीं है जब आप केवल एक ही परिणाम के साथ एकवचन दोहरे उद्धरण का उपयोग कर सकते हैं।
राकविम

हां, मेरा मतलब था प्लस साइन। इसके बिना दोहरे उद्धरण केवल ठीक लग रहे हैं, एक पठनीय के बजाय इसका पठनीय और आसान स्थान है, जिसका उपयोग सिंगल लाइन स्ट्रिंग्स पर किया जाना चाहिए।
juliangonzalez

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
'<<' के रूप में '-' के बिना वंशानुगत का उपयोग करते हुए, अतिरिक्त नेता रिक्त स्थान शामिल करेंगे। मार्क बायर्स की प्रतिक्रिया देखें।
Ives

heredoc में नए कोड शामिल होंगे जो मूल कोड के समतुल्य नहीं हैं।
जोश

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नहीं,?
KingPuppy

शायद, यह मेरे <<-EOFउदाहरण के लिए काम करने लगा । मेरा अनुमान है कि या तो रास्ता काम करता है।
एलेक्स कोहेन

heredoc में नए कोड शामिल होंगे जो मूल कोड के समतुल्य नहीं हैं।
जोश

11

रूबी 2.3 में नई विशेषताओं के साथ हाल ही में नया 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/multiline-strings-ruby-2-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यह सक्षम है तो काम नहीं करेगा
Raido

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(' ')

इस सुझाव से यहाँ के दस्तावेज़ों और लंबे तार पर यह फायदा होता है कि ऑटो-इंडेंटर्स स्ट्रिंग के प्रत्येक भाग को उचित रूप से इंडेंट कर सकते हैं। लेकिन यह एक दक्षता लागत पर आता है।


@ ऐडन, आप कॉमा को बैकस्लैश (एक ला सी) से बदल सकते हैं और इसमें शामिल नहीं (या एरे) की आवश्यकता होगी: दुभाषिया (ज्यादातर मुझे लगता है) पार्स समय में तारों को समतल कर देगा, जिससे यह अधिकांश विकल्पों की तुलना में बहुत सुंदर हो जाता है। । हालांकि, एक फायदा यह है कि तार की एक सरणी में शामिल होने के लिए, कुछ ऑटो-इंडेंटर्स नेक काम करते हैं, जैसे कि वे करते हैं, उदाहरण के लिए, यहां-डॉस स्ट्रिंग्स या \ के साथ।
वेन कॉनराड

1
एक नोट, हेरेडोक सिंटैक्स << - उचित इंडेंटेशन की अनुमति देगा।
ए। विल्सन

2

रूबी तरह से (टीएम) रूबी 2.3 के बाद से: नई-पंक्तियों और उचित identation उपयोग टेढ़ा-मेढ़ा के साथ एक बहु लाइन स्ट्रिंग को परिभाषित करने के हियरडॉक <<~ :

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..."

यदि उद्देश्य नई कथानक से बचने के लिए है (जो स्क्वीजीली HEREDOC, उद्धरण और प्रतिशत स्ट्रिंग शाब्दिक कारण होगा), तो अंतिम गैर-व्हाट्सएप चरित्र के रूप में एक बैकस्लैश लाइन जारी रहेगी और रूबी को स्ट्रिंग्स को वापस जोड़ने के लिए रूबी करेगी। (उद्धृत स्ट्रिंग के अंदर उन स्थानों के लिए देखें):

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का उपयोग करते हैं तो लीडिंग और ट्रेलिंग स्पेस की स्ट्रिंग को अलग कर देंगे और लगातार सभी व्हाट्सएप (newlines, tabs, और सभी) को एक ही स्थान पर गिरा देंगे:

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..."

अधिक जानकारी:

रूबी HEREDOC सिंटेक्स

स्ट्रिंग्स कार्यों के लिए यहां दस्तावेज़ संकेतन कोड में पाठ इनलाइन के लंबे ब्लॉक को नामित करने का एक तरीका है। यह <<उपयोगकर्ता द्वारा परिभाषित स्ट्रिंग (स्ट्रिंग टर्मिनेटर की समाप्ति) द्वारा शुरू किया गया है। जब तक स्ट्रिंग टर्मिनेटर के अंत में पाया जाता है सभी निम्नलिखित लाइनों concatenated रहे हैं बहुत शुरुआत एक लाइन की:

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

स्ट्रिंग टर्मिनेटर का अंत स्वतंत्र रूप से चुना जा सकता है, लेकिन "ईओएस" (स्ट्रिंग का अंत) या ऐसा कुछ उपयोग करना आम है जो स्ट्रिंग के डोमेन से मेल खाता है जैसे "एसक्यूएल"।

HEREDOC डिफ़ॉल्ट रूप से या EOS टर्मिनेटर के दोहरे होने पर प्रक्षेप का समर्थन करता है :

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

यदि EOS टर्मिनेटर को उद्धृत किया जाता है, तो इंटरपोल को निष्क्रिय किया जा सकता है:

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"

रूबी 2.3 के बाद से, अब हमारे पास मुख्य रूप से व्हाट्सएप <<~को हटा दिया गया है :

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"

HEREDOC कुछ पागल सामान कर सकता है जैसे कि backticks का उपयोग करके कमांड निष्पादित करना:

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

HEREDOC स्ट्रिंग परिभाषाओं को "स्टैक्ड" किया जा सकता है, जिसका अर्थ है कि पहला 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

यदि आपके पास रूबी 2.3 नहीं है, लेकिन रेल >=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 पूर्व ब्लॉक के अंदर रिक्ति को बरकरार रखे हुए है और बाद ऐसा नहीं करता।

अन्य विकल्प भी हैं। जैसे समागम आदि लेकिन यह सामान्य रूप से अधिक समझ में आता है।

अगर मैं यहाँ गलत हूँ, मुझे कैसे पता ...


heredoc में नए कोड शामिल होंगे जो मूल कोड के समतुल्य नहीं हैं।
जोश

1

आपकी तरह, मैं भी एक ऐसे समाधान की तलाश में था, जिसमें नई सूचियाँ शामिल न हों । (हालांकि वे SQL में सुरक्षित हो सकते हैं, वे मेरे मामले में सुरक्षित नहीं हैं और मेरे पास निपटने के लिए पाठ का एक बड़ा ब्लॉक है)

यह यकीनन बदसूरत के रूप में है, लेकिन आप परिणामी स्ट्रिंग से उन्हें छोड़ने के लिए एक हेरेडोक में नई-नई सूची बना सकते हैं:

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}यहां मूल्यांकन किया जाएगा, जबकि वे आपके मूल कोड में नहीं होंगे। ए विल्सन का जवाब उस कारण से बेहतर हो सकता है।

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