Bazı yaml nesneleri başkalarına ifade ediyor: her zaman nesneleri yeniden gelmez (dize sadece tekrarlanır) ama bazen (hash kez tanımlanmış ve referans olarak yeniden kullanılır olmadığını
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
Not). Yapmaya çalıştığınız gibi görünüyor budur - -
YAML dize interpolasyon desteklemez ama biraz daha verbosely kodlamak olamazdı neden yok:
intro: Hello, dear user
registration:
- "%s Thanks for registering!"
- intro
new_message:
- "%s You have a new message!"
- intro
O zaman enterpolasyon yapabilmektedir Eğer YAML yüklemek sonra:
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
Ve bu verecektir interpolated
için aşağıdaki:
{
"intro"=>"Hello, dear user",
"registration"=>"Hello, dear user Thanks for registering!",
"new_message"=>"Hello, dear user You have a new message!"
}
İlginç. İki soru: [1] Yani dökümü sadece bir dizge döndürmez, ancak yürütme ortamında değişkenler arar mı? [2] 'hash' vakasında neler olduğunu anladığımdan emin değilim. –
@John: [1] dump değişkenlere bakmaz - ancak geçirilen nesnede tekrarlamayı arar. [2] YAML.dump ([hash, hash]) 'da, karakter dizileri için bir dizi karma sembolleri vardı. Diziyi incelerken, iki karmaşanın aynı nesneye başvurduğunu tespit etti. Bu yüzden, ilk kez bu karma yazdı, bu hash için bir tanımlayıcı ('& id001') verdi ve ikincisi, tekrar tüm şeyi basmak yerine, tanımlayıcıya (' * id001') atıfta bulundu. – rampion
Anladım. Bu yüzden, yaml dosyaları içindeki nesneleri yeniden kullanma arayışımdaki hiçbir şey beni anlamıyor değil mi? –