2010-06-29 19 views
5

मैं इतना की तरह, एक YAML वस्तु दूसरे का हवाला राशि चाहते हैं:क्या एक वाईएएमएल ऑब्जेक्ट दूसरे को संदर्भित कर सकता है?

intro: "Hello, dear user." 

registration: $intro Thanks for registering! 

new_message: $intro You have a new message! 

ऊपर वाक्य रचना सिर्फ यह कैसे काम कर सकते हैं का एक उदाहरण है

(यह भी कि यह कैसे this cpan module में काम करने लगता है है।)

मैं मानक माणिक YAML पार्सर उपयोग कर रहा हूँ।

क्या यह संभव है?

उत्तर

7

कुछ YAML वस्तुओं दूसरों का उल्लेख करते हैं:

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 

ध्यान दें कि यह हमेशा वस्तुओं का पुन: उपयोग नहीं करता है (स्ट्रिंग सिर्फ दोहराया है), लेकिन यह करता है कभी कभी (हैश एक बार परिभाषित और संदर्भ द्वारा पुन: उपयोग किया जाता है)।

YAML स्ट्रिंग प्रक्षेप का समर्थन नहीं करता है - जो है कि आप क्या करने की कोशिश कर लगता है - लेकिन वहाँ कोई कारण नहीं है कि आप इसे थोड़ा वरबोस रूप में दर्शा सांकेतिक शब्दों में बदलना नहीं कर सकता है:

intro: Hello, dear user 
registration: 
- "%s Thanks for registering!" 
- intro 
new_message: 
- "%s You have a new message!" 
- intro 

तो फिर तुम यह कर सकते हैं अंतर्वेशन आप 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 

और यह निकलेगा interpolated के लिए निम्नलिखित:

{ 
    "intro"=>"Hello, dear user", 
    "registration"=>"Hello, dear user Thanks for registering!", 
    "new_message"=>"Hello, dear user You have a new message!" 
} 
+0

दिलचस्प। दो प्रश्न: [1] तो डंप सिर्फ स्ट्रिंग नहीं लौटाता है, लेकिन निष्पादन वातावरण में चर के लिए दिखता है? [2] मुझे यकीन नहीं है कि मैं समझता हूं कि 'हैश' मामले में क्या हुआ। –

+1

@ जॉन: [1] डंप चर पर गौर नहीं करता - लेकिन यह डब्ल्यू पारित कर दिया वस्तु में/पुनरावृत्ति के लिए दिखता है। [2] 'YAML.dump ([हैश, हैश]) में, 'इसमें तारों के प्रतीक के हैंश की एक सरणी थी। सरणी के निरीक्षण में, यह पाया गया कि दो हैंश एक ही वस्तु का जिक्र कर रहे थे। तो पहली बार यह हैश मुद्रित, यह है कि हैश के लिए एक पहचानकर्ता ('और id001'), और दूसरी बार दिया था, बजाय पूरी बात फिर से प्रिंट के लिए, यह है कि पहचानकर्ता संदर्भित (' * id001')। – rampion

+0

मैं देखता हूं। तो यह वास्तव में yaml फ़ाइलों के भीतर वस्तुओं का पुन: उपयोग करने के लिए मेरी खोज में कहीं भी नहीं मिलता है, है ना? –

2

अपने यम में निहित संदर्भों का उपयोग करने की कोशिश करने के बजाय, आप प्रतिस्थापन तारों का उपयोग क्यों नहीं करते हैं (जैसा कि आप ऊपर दिखाते हैं, आपको उद्धरण की आवश्यकता है) और स्पष्ट रूप से पार्स समय पर उनकी सामग्री को प्रतिस्थापित करें?

+0

उस अर्थ में, मुझे लगता है कि मेरा सवाल है "क्या मानक रूबी वाईएएमएल पार्सर पहले से ही इसका समर्थन करता है?" –

संबंधित मुद्दे

 संबंधित मुद्दे