2010-06-30 15 views
5

मैं इतना बहुआयामी सरणियों, मैं जहां निर्दिष्ट करने तथा द्वारारूबी में बहु-आयामी हैश सरणी का ऑटो-प्रारंभिक संभव है, क्योंकि यह PHP में है?

unset($a); // just to show that there is no variable $a 
$a['settings']['system']['memory'] = '1 Gb'; 
$a['settings']['system']['disk space'] = '100 Gb'; 

एक हैश को प्रारंभ कर सकते हैं वहाँ रूबी में इसी तरह के काम करते हैं करने के लिए एक रास्ता है साथ PHP में काम करता था रहा हूँ? या मुझे पहले सभी आयामों को प्रारंभ करने की आवश्यकता है, और उसके बाद मान असाइन करना है। क्या एक उन्नत हैश को परिभाषित करना संभव है जो मुझे करने की अनुमति देगा? आप वह कैसे करेंगें?

class AutoHash < Hash 
    def initialize(*args) 
    super() 
    @update, @update_index = args[0][:update], args[0][:update_key] unless args.empty? 
    end 

    def [](k) 
    if self.has_key?k 
     super(k) 
    else 
     AutoHash.new(:update => self, :update_key => k) 
    end 
    end 

    def []=(k, v) 
    @update[@update_index] = self if @update and @update_index 
    super 
    end 
end 
:


अद्यतन

समाधान डगलस (नीचे देखें) द्वारा प्रस्तावित के अलावा, मैं एक thread on the subject, जिसमें ब्रायन Schröäer Hash वर्ग के लिए एक विस्तार का प्रस्ताव किया है पाया है

यह समस्या को हल करने की अनुमति देता है जब एक अनुपलब्ध हैश आइटम अवांछित रूप से बनाया जाता है जब आइटम मान केवल अनुरोध किया गया था, उदाहरण के लिए a['key']


कुछ अतिरिक्त संदर्भ

  1. ruby hash autovivification (facets)
  2. http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
  3. http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml
+0

मैं एक PHP व्यक्ति हूं और रूबी के बारे में कुछ नहीं जानता, लेकिन मेरी राय में, यह PHP के भयानक लक्षणों में से एक है जिसे अन्य भाषाओं में निर्यात नहीं किया जाना चाहिए। :) (हालांकि मुझे समझ में आता है कि कोई ऐसी स्थिति में क्यों चाहेंगे।) –

उत्तर

7

इस प्रयास करें:

0,123,
def hash_with_default_hash 
    Hash.new { |hash, key| hash[key] = hash_with_default_hash } 
end 

a = hash_with_default_hash 

यदि कुंजी मौजूद नहीं है, तो ब्लॉक का परिणाम डिफ़ॉल्ट मान के रूप में उपयोग किया जाएगा। इस मामले में, डिफ़ॉल्ट मान भी हैश है जो हैश का उपयोग अपने डिफ़ॉल्ट मानों के रूप में करता है।

+1

यह एक आकर्षण की तरह काम करता है! धन्यवाद, डगलस – Andrei

+0

इच्छा रखने के लिए एक और चीज है - अगर मैं केवल आइटम मान 'a ['key']' की जांच करता हूं, तो कुंजी मौजूद होने पर कुंजी 'कुंजी' वाला एक नया आइटम बनाया जाएगा। इस तरह के व्यवहार से कैसे बच सकता है? – Andrei

+1

आप हैश # है_की के बाद हैं? http://ruby-doc.org/core/classes/Hash.html#M002883 – Douglas

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

  • कोई संबंधित समस्या नहीं^_^