मैं इतना बहुआयामी सरणियों, मैं जहां निर्दिष्ट करने तथा द्वारारूबी में बहु-आयामी हैश सरणी का ऑटो-प्रारंभिक संभव है, क्योंकि यह 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']
।
कुछ अतिरिक्त संदर्भ
- ruby hash autovivification (facets)
- http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
- http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml
मैं एक PHP व्यक्ति हूं और रूबी के बारे में कुछ नहीं जानता, लेकिन मेरी राय में, यह PHP के भयानक लक्षणों में से एक है जिसे अन्य भाषाओं में निर्यात नहीं किया जाना चाहिए। :) (हालांकि मुझे समझ में आता है कि कोई ऐसी स्थिति में क्यों चाहेंगे।) –