रूबी तरह से (टीएम) रूबी 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..."
चेतावनी यह है कि यह लाइन-ब्रेक पर काम नहीं करता है, क्योंकि रूबी बयान के अंत की व्याख्या कर रहा है और परिणामी लाइन सिर्फ एक लाइन पर अकेले कुछ भी नहीं करता है।