2013-04-05 4 views
17

कहें कि मैं अपने रूबी कोड के साथ सुंदर मुद्रित एचटीएमएल कोड स्ट्रेट इनलाइन का एक बहुत बड़ा ब्लॉक रखना चाहता था। मेरी स्ट्रिंग में किसी भी स्वरूपण को खोए बिना या किसी प्रकार के gsub regex को याद किए बिना ऐसा करने का सबसे साफ तरीका क्या है।क्या रुबी में मल्टीलाइन इंडेंट स्ट्रिंग करने का कोई आसान तरीका है?

यह सब एक पंक्ति में एन्कोडिंग को पढ़ने के लिए करना आसान है, लेकिन मुश्किल है:

1.times do 
    # Note that the spaces have been changed to _ so that they are easy to see here. 
    doc = "\n<html>\n__<head>\n____<title>\n______Title\n____</title>\n__</head>\n__<body>\n____Body\n__</body>\n</html>\n" 
    ans = "Your document: %s" % [doc] 
    puts ans 
end 

माणिक में बहुपंक्ति पाठ आसान है पढ़ने के लिए, लेकिन स्ट्रिंग कोड के बाकी के साथ इंडेंट नहीं किया जा सकता:

1.times do 
    doc = " 
<html> 
    <head> 
    <title> 
     Title 
    </title> 
    </head> 
    <body> 
    Body 
    </body> 
</html> 
" 
    ans = "Your document: %s" % [doc] 
    puts ans 
end 

उदाहरण के लिए निम्नलिखित मेरी कोड के साथ इंडेंट है, लेकिन स्ट्रिंग अब हर पंक्ति के सामने चार अतिरिक्त रिक्त स्थान दिया गया है:

1.times do 
    doc = <<-EOM 

    <html> 
     <head> 
     <title> 
      Title 
     </title> 
     </head> 
     <body> 
     Body 
     </body> 
    </html> 
    EOM 
    ans = "Your document: %s" % [doc] 
    puts ans 
end 

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

+1

चेक आउट - इसके अलावा http://stackoverflow.com/questions/3350648/ruby-indented-multiline-strings – theglauber

+1

- http: // stackoverflow।कॉम/प्रश्न/3772864/कैसे करें-मैं-हटा-अग्रणी-व्हाइटस्पेस-वर्ण-से-रूबी-हेरेडोक – theglauber

+0

'मेरे पास एक स्ट्रिंग है ("जब \ n \ n घड़ी \ n स्ट्राइक \ n दस \ n") अगर यह वास्तविक न्यूलाइन अक्षरों के साथ टाइप किया जा सकता है तो यह बहुत साफ होगा। 'समझ में नहीं आता है। '" \ n "' वास्तविक न्यूलाइन अक्षर हैं। –

उत्तर

19
string = %q{This 
    is 
     indented 
    and 
    has 
     newlines} 

Here%q{}, %Q{} और दूसरों के कुछ उदाहरण के साथ एक ब्लॉग है।

जहां तक ​​इसे याद रखना आसान है, 'कोटेशन मार्क' के लिए 'क्यू' सोचें।

सिडेनोटे: तकनीकी रूप से आपको उद्धरण करते समय 'क्यू' की आवश्यकता नहीं है।

string = %{This 
    also 
     is indented 
    and 
    has 
    newlines 
     and handles interpolation like 1 + 1 = #{1+1} 
} 

हालांकि, यह सबसे अच्छा अभ्यास और अधिक %Q{} उपयोग करने के लिए पठनीय है।

+1

'+ 1'। :) –

+0

मुझे% q {},% क्यू {}, और% {} पसंद है। हालांकि मैं चाहता हूं कि स्ट्रिंग को मेरे कोड से इंडेंट किया जाए। मैं अपने प्रश्न को फिर से लिखता हूं ताकि यह स्पष्ट हो। –

3

यह वास्तविक नहीं है कि आप क्या पूछ रहे हैं। अगर मैं की तरह तार उत्पन्न करने के लिए चाहता था:

"when \n the\n clock\n strikes\n ten\n" 
मक्खी पर

, मैं उन्हें गतिशील रूप से निर्माण चाहते हैं:

%w[when the clock strikes ten].join("\n ") 
=> "when\n the\n clock\n strikes\n ten" 

श्रृंखलाबद्ध एक अनुगामी "\n" अनुगामी गाड़ी वापसी जोड़ देगा:

%w[when the clock strikes ten].join("\n ") + "\n" 
=> "when\n the\n clock\n strikes\n ten\n" 

यदि मैं उप-तारों से जुड़ा हुआ हूं जिसमें रिक्त स्थान हैं, तो मैं सरणी को समायोजित कर दूंगा:

['when the', 'clock strikes', 'ten'].join("\n ") + "\n" 
=> "when the\n clock strikes\n ten\n" 
+0

आप सही हैं प्रश्न को समझना मुश्किल था। मैं इसे फिर से लिखता हूं। उम्मीद है कि अब समझना आसान है। –

15

रूबी 2.3, <<~ हियरडॉक स्ट्रिप्स प्रमुख सामग्री खाली स्थान के बाद से:

def make_doc(body) 
    <<~EOF 
    <html> 
    <body> 
     #{body} 
    </body> 
    </html> 
    EOF 
end 

puts make_doc('hello') 

बड़े रूबी संस्करण के लिए, निम्न अन्य उत्तर में प्रस्तुत समाधान की तुलना में अधिक वर्बोज़ है, लेकिन वहाँ लगभग कोई प्रदर्शन भूमि के ऊपर है। यह एक लंबी स्ट्रिंग शाब्दिक रूप में के बारे में के रूप में तेजी से है:

def make_doc(body) 
    "<html>\n"  \ 
    " <body>\n"  \ 
    " #{body}\n" \ 
    " </body>\n" \ 
    "</html>" 
end 
संबंधित मुद्दे

 संबंधित मुद्दे