2009-04-03 9 views
7

folgende ...Rubin: Escape-Sequenzen zu YAML schreiben

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

... Ausgänge ...

--- this is a b&d string 

Wie kann ich es zur Ausgabe erhalten

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

???

+0

Wie ich aus der Dokumentation zu verstehen, das ist die einzige Art, wie ich Zeichen halten kann wie die & und: (http://www.yaml.org/YAML_for_ruby.html#single-quoted_strings). Ich speichere URLs in dieser Yaml-Datei, die ich später intakt in Ruby ziehen kann. – neezer

Antwort

19

Wenn Sie einen maskierten String in YAML speichern möchten, es #inspect mit entkommen, bevor Sie es zu YAML konvertieren:

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 keine Strings nicht zitieren, es sei denn es hat. Es zitiert Strings, wenn sie Dinge enthalten, dass es vermissen würde, wenn sie es nicht notierte gespeichert - wie Anführungszeichen umgeben oder nachgestellte oder führende Leerzeichen:

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 

jedoch als YAML Verbraucher, ob der String zitiert sollte keine Rolle spielen für dich. Sie sollten den YAML-Text niemals selbst analysieren - überlassen Sie ihn den Bibliotheken. Wenn Sie die Zeichenfolge in der YAML-Datei zitiert werden müssen, riecht das schlecht zu mir.

Es spielt keine Rolle, ob die Saiten haben '&' s in ihnen wird YAML die Zeichenfolge erhalten:

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

Verstanden. Danke für die Klarstellung! – neezer

+7

Zur weiteren Klarstellung werden Anführungszeichen nur benötigt, wenn & am * Anfang * eines Wertes erscheint - und die YAML-Bibliothek wird in diesem Fall automatisch die Zeichenkette angeben. Es ist nie notwendig, Werte für YAML vorzuverarbeiten. – Chuck

0

Wie pro YAML 1.2 Specification ist JSON-Dokument ein gültiges YAML Dokument.

Das Hauptziel dieser Überarbeitung besteht darin, YAML als offizielle Teilmenge in Übereinstimmung mit JSON zu bringen.

Daher ist eine gültige JSON-Zeichenfolge eine gültige YAML-Zeichenfolge.

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

Dies ist äußerst geeignet für YAML-Dateien mit ERB Syntax angereichert, wo string.to_yaml wird in vielen Fällen nicht funktionieren.

Beispiel:

# openvpn.yml.erb 
openvpn: 
    cert: <%= ENV.fetch('OPENVPN_CERT').to_json %> 
    key: <%= ENV.fetch('OPENVPN_KEY').to_json %>