2010-06-29 11 views
5

Öyle gibi tek yaml nesne başka başvurmak zorunda istiyorum:Bir YAML nesnesi diğerine başvuruda bulunabilir mi?

intro: "Hello, dear user." 

registration: $intro Thanks for registering! 

new_message: $intro You have a new message! 

Yukarıdaki sözdizimi o işe yarayabilecek nasıl sadece bir örnektir

(o this cpan module çalışmak gibi görünüyor nasıl da bu.)

Standart ruby ​​yaml ayrıştırıcısını kullanıyorum.

Bu mümkün mü?

cevap

7

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!" 
} 
+0

İ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. –

+1

@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

+0

Anladım. Bu yüzden, yaml dosyaları içindeki nesneleri yeniden kullanma arayışımdaki hiçbir şey beni anlamıyor değil mi? –

2

yaml'inizde örtük referanslar kullanmaya çalışmak yerine, neden değiştirme dizelerini kullanmıyorsunuz (yukarıda gösterdiğiniz gibi, hatta tırnaklara ihtiyacınız var) ve bunların içeriğini parse zamanında açıkça belirtiniz?

+0

Bu anlamda, sorumun "standart Ruby YAML ayrıştırıcısını zaten açıkça destekliyor mu?" –

İlgili konular