2009-04-03 16 views
7

निम्नलिखित भाग स्ट्रिंग लिखें ...रूबी: YAML

require 'yaml' 
test = "I'm a b&d string" 
File.open('test.yaml', 'w') do |out| 
    out.write(test.to_yaml) 
end 

... आउटपुट ...

--- this is a b&d string 

मैं इसे कैसे उत्पादन करने के लिए प्राप्त कर सकते हैं

--- 'this is a b&d string' 

???

+0

मैं डॉक्स से समझने के रूप में, कि एक ही रास्ता मैं जैसे पात्रों और और रख सकते है: (http://www.yaml.org/YAML_for_ruby.html#single-quoted_strings)। मैं इस yaml फ़ाइल में यूआरएल संग्रहीत कर रहा हूं कि मैं बाद में रुबी में वापस खींचने में सक्षम होना चाहता हूं। – neezer

उत्तर

19

आप YAML में एक भाग निकले स्ट्रिंग स्टोर करने के लिए चाहते हैं, #inspect का उपयोग करके उसे इससे पहले कि आप YAML में बदलने का:

irb> require 'yaml' 
=> true 
irb> str = %{This string's a little complicated, but it "does the job" (man, I hate scare quotes)} 
=> "This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)" 
irb> puts str 
This string's a little complicated, but it "does the job" (man, I hate scare quotes) 
=> nil 
irb> puts str.inspect 
"This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)" 
=> nil 
irb> puts str.to_yaml 
--- This string's a little complicated, but it "does the job" (man, I hate scare quotes) 
=> nil 
irb> puts str.inspect.to_yaml 
--- "\"This string's a little complicated, but it \\\"does the job\\\" (man, I hate scare quotes)\"" 
=> nil 

YAML तार बोली नहीं है जब तक कि यह करने के लिए है। यह तार उद्धरण अगर वे चीजों को शामिल करता है, तो यह है कि यह गैर उद्धृत संग्रहीत है कि यह याद होगा - उद्धरण वर्ण आसपास या पीछे या प्रमुख रिक्त स्थान की तरह:

irb> puts (str + " ").to_yaml 
--- "This string's a little complicated, but it \"does the job\" (man, I hate scare quotes) " 
=> nil 
irb> puts %{"#{str}"}.to_yaml 
--- "\"This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)\"" 
=> nil 
irb> puts (" " + str).to_yaml 
--- " This string's a little complicated, but it \"does the job\" (man, I hate scare quotes)" 
=> nil 

हालांकि, एक YAML उपभोक्ता के रूप में, स्ट्रिंग उद्धृत किया गया है कि क्या कोई फर्क नहीं करना चाहिए आप को। आपको कभी भी वाईएएमएल पाठ को पार्स नहीं करना चाहिए - इसे पुस्तकालयों में छोड़ दें। यदि आप को की आवश्यकता है तो स्ट्रिंग को YAML फ़ाइल में उद्धृत किया जाना चाहिए, जो मुझे खराब करता है।

इससे कोई फर्क नहीं पड़ता कि आपके तार है उन में '& की, YAML स्ट्रिंग सुरक्षित करेगा:

irb> test = "I'm a b&d string" 
=> "I'm a b&d string" 
irb> YAML::load(YAML::dump(test)) 
=> "I'm a b&d string" 
irb> YAML::load(YAML::dump(test)) == test 
=> true 
+0

समझ गया। स्पष्टीकरण के लिए धन्यवाद! – neezer

+7

आगे स्पष्टीकरण के लिए, उद्धरण केवल तभी आवश्यक होते हैं जब मूल्य के * प्रारंभ * पर दिखाई देता है - और YAML लाइब्रेरी स्वचालित रूप से उस स्थिति में स्ट्रिंग को उद्धृत करेगी। वाईएएमएल के लिए मूल्यों को प्रीप्रोसेस करना कभी जरूरी नहीं है। – Chuck

0

प्रति YAML 1.2 Specification के रूप में, JSON दस्तावेज़ मान्य YAML दस्तावेज है।

इस संशोधन का प्राथमिक उद्देश्य वाईएएमएल को आधिकारिक सबसेट के रूप में जेएसओएन के अनुपालन में लाने के लिए है।

इसलिए, एक मान्य JSON स्ट्रिंग एक वैध YAML स्ट्रिंग है।

require 'json' 
'my string'.to_json # => produces a valid YAML string 

यह ERB वाक्य रचना जहां string.to_yaml कई मामलों में काम नहीं करेगा के साथ समृद्ध YAML फ़ाइलों के लिए अत्यंत उपयोगी है।

उदाहरण:

# openvpn.yml.erb 
openvpn: 
    cert: <%= ENV.fetch('OPENVPN_CERT').to_json %> 
    key: <%= ENV.fetch('OPENVPN_KEY').to_json %> 
संबंधित मुद्दे