2012-01-19 19 views
13

मैं ActiveSupport द्वारा प्रदान की गई इस सुविधा से अवगत हूं।मैं जावास्क्रिप्ट शैली हैश एक्सेस कैसे प्राप्त कर सकता हूं?

h = ActiveSupport::OrderedOptions.new 
h.boy = 'John' 
h.girl = 'Mary' 
h.boy # => 'John' 
h.girl # => 'Mary' 

हालांकि मैं पहले से ही एक बड़ी हैश है और मैं डॉट नोटेशन का उपयोग कर कि हैश का उपयोग करना चाहते हैं। मैंने यही कोशिश की:

large_hash = {boy: 'John', girl: 'Mary'} 
h = ActiveSupport::OrderedOptions.new(large_hash) 
h.boy # => nil 

यह काम नहीं किया। मै इसे काम मे कैसे ले सकता हूँ।

मैं गहरे लाल रंग का उपयोग कर रहा हूँ 1.9.2

अद्यतन:

माफ करना, मैं उल्लेख किया जाना चाहिए था कि मैं openstruct उपयोग नहीं कर सकते क्योंकि यह each_pair तरीका है जिसके Struct है नहीं है। मैं पहले से चाबियाँ नहीं जानता इसलिए मैं ओपनस्ट्रक्चर का उपयोग नहीं कर सकता।

+0

लगभग एक समान प्रश्न: - हैश कुंजी http://stackoverflow.com/questions/2240535/ruby-hash-keys-as-methods-on-a-class –

+0

[रूबी के संभावित डुप्लिकेट विधि नामों के लिए?] (http://stackoverflow.com/questions/6423484/ru by-hash-keys-to-method-names) –

उत्तर

9

OpenStruct लिए देख रहे हैं इस के लिए अच्छी तरह से काम करना चाहिए।

आप यह कैसे काम करता है देखने के लिए, या शायद एक अनुकूलित संस्करण बनाने के लिए, कुछ इस तरह के साथ शुरू करना चाहते हैं:

h = { 'boy' => 'John', 'girl' => 'Mary' } 

class << h 
    def method_missing m 
    self[m.to_s] 
    end 
end 

puts h.nothing 
puts h.boy 
puts h.girl 
6

आप के लिए OpenStruct

$ require 'ostruct' 
$ large_hash_obj = OpenStruct.new large_hash 
$ large_hash_obj.boy 
=> "John" 
+0

क्षमा करें मुझे यह उल्लेख करना चाहिए था कि मैं ओपनस्ट्रक्चर का उपयोग नहीं कर सकता क्योंकि इसमें स्ट्रक्चर की प्रत्येक_पैयर विधि नहीं है। मैं हाथ से पहले चाबियाँ नहीं जानता इसलिए मैं ओपनस्ट्रक्चर का उपयोग नहीं कर सकता। –

4

I created my own gem for this, और मैं अपने सभी परियोजनाओं में यह प्रयोग कर रहे। ऐसा करने के लिए आपको लगता है कि आपको क्या चाहिए:

large_hash = { boy: 'John', girl: 'Mary' } 
r = Ribbon.wrap large_hash 

r.boy 
=> "John" 

r.girl 
=> "Mary" 

r.keys 
=> [:boy, :girl] 

r.each_pair { |key, value| puts "#{key} => #{value}" } 
boy => John 
girl => Mary 

कुछ प्रतिक्रिया पसंद करेंगे।

3

तो यह सिर्फ एक छोटा सा स्क्रिप्ट है यह Hash ही

class Hash 
    def method_missing sym,* 
    fetch(sym){fetch(sym.to_s){super}} 
    end 
end 

method_missing विस्तार करने के लिए सुरक्षित है एक जादू विधि जब भी आपके कोड एक विधि है जो मौजूद नहीं कॉल करने के लिए कोशिश करता है कहा जाता है कि है। रूबी रन टाइम पर असफल कॉल को रोक देगा और आपको इसे संभालने देगा ताकि आपका प्रोग्राम गर्व से ठीक हो सके। उपरोक्त कार्यान्वयन, विधि नाम का उपयोग करके प्रतीक नाम का उपयोग करके हैश तक पहुंचने का प्रयास करता है, विधि नाम को स्ट्रिंग के रूप में उपयोग करता है, और अंत में रूबी की अंतर्निहित विधि अनुपलब्ध त्रुटि के साथ विफल रहता है।

एक अधिक जटिल आवेदन है, जहां सभी हैश को यह व्यवहार जोड़ने अन्य कोड या third0party जवाहरात तोड़ सकता है, एक मॉड्यूल का उपयोग करें और प्रत्येक उदाहरण

module H 
    def method_missing sym,* 
    fetch(sym){fetch(sym.to_s){super}} 
    end 
end 

the = { answer: 42 } 
the.extend(H) 
the.answer # => 42 

विस्तार के लिए और अधिक से अधिक सुविधा के लिए आप भी नीचे मॉड्यूल का प्रचार कर सकते हैं नेस्टेड हैश को

module H 
    def method_missing sym,* 
    r = fetch(sym){fetch(sym.to_s){super}} 
    Hash === r ? r.extend(H) : r 
    end 
end 

the = { answer: { is: 42 } } 
the.extend(H) 
the.answer.is # => 42 
संबंधित मुद्दे

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