Alcuni oggetti YAML fanno riferimento agli altri:
irb> require 'yaml'
#=> true
irb> str = "hello"
#=> "hello"
irb> hash = { :a => str, :b => str }
#=> {:a=>"hello", :b=>"hello"}
irb> puts YAML.dump(hash)
---
:a: hello
:b: hello
#=> nil
irb> puts YAML.dump([str,str])
---
- hello
- hello
#=> nil
irb> puts YAML.dump([hash,hash])
---
- &id001
:a: hello
:b: hello
- *id001
#=> nil
Si noti che non sempre riutilizzare gli oggetti (la stringa è solo ripetuto), ma lo fa a volte (l'hash viene definita una volta e riutilizzato per riferimento).
YAML non supporta stringa di interpolazione - che è quello che sembra essere cercando di fare - ma non c'è ragione per cui non si poteva codificare un po 'più verboso:
intro: Hello, dear user
registration:
- "%s Thanks for registering!"
- intro
new_message:
- "%s You have a new message!"
- intro
Quindi è possibile interpolare esso dopo aver caricato il YAML:
strings = YAML::load(yaml_str)
interpolated = {}
strings.each do |key,val|
if val.kind_of? Array
fmt, *args = *val
val = fmt % args.map { |arg| strings[arg] }
end
interpolated[key] = val
end
E questo produrrà quanto segue per interpolated
:
{
"intro"=>"Hello, dear user",
"registration"=>"Hello, dear user Thanks for registering!",
"new_message"=>"Hello, dear user You have a new message!"
}
Interessante. Due domande: [1] Quindi dump non restituisce solo una stringa, ma cerca le variabili nell'ambiente di esecuzione? [2] Non sono sicuro di aver capito cosa è successo nel caso dell'hash. –
@John: [1] il dump non analizza le variabili, ma cerca la ripetizione w/nell'oggetto passato. [2] in 'YAML.dump ([hash, hash])', aveva una serie di hash di simboli sulle stringhe. Nel suo controllo dell'array, ha scoperto che i due hash si riferivano allo stesso oggetto. Quindi, la prima volta che stampava l'hash, forniva un identificatore ('& id001') per quell'hash, e la seconda volta, invece di stampare di nuovo l'intera cosa, faceva riferimento a quell'identificatore (' * id001'). – rampion
Capisco. Quindi questo non mi porta da nessuna parte nel mio tentativo di riutilizzare oggetti all'interno di file yaml, giusto? –