2008-10-04 20 views
34

रुबी में हैश के हैंश बनाने के लिए सुविधाजनक दो (या अधिक) आयामी लुकअप की अनुमति मिलती है। हालांकि, किसी को डालने पर हमेशा यह जांचना चाहिए कि हैश में पहली अनुक्रमणिका पहले से मौजूद है या नहीं। उदाहरण के लिए:रूबी में हैशस इडियॉम का हैश?

h = Hash.new 
h['x'] = Hash.new if not h.key?('x') 
h['x']['y'] = value_to_insert 

यह जहां नए हैश अपने आप बन जाता निम्न कार्य के लिए बेहतर होगा:

h = Hash.new 
h['x']['y'] = value_to_insert 

इसी प्रकार, जब एक मूल्य जहां पहले सूचकांक पहले से ही मौजूद नहीं है को देख, '[]' त्रुटि के लिए एक अपरिभाषित विधि प्राप्त करने के बजाय शून्य वापस लौटाए जाने पर यह बेहतर होगा।

looked_up_value = h['w']['z'] 

एक एक हैश आवरण वर्ग इस व्यवहार किया है, लेकिन इस कार्य को पूरा करने के लिए एक मौजूदा एक रूबी मुहावरा है कि बना सकते हैं?

h = Hash.new { |h, k| h[k] = Hash.new } 
बेशक

, इस रिकर्सिवली किया जा सकता है:

+0

वहाँ एक हैश है हैश मुहावरे जो एक निश्चित गहराई के बाद 0 लौटाएंगे? (मैं चीजों की गिनती कर रहा हूं और मैं एच का उपयोग कर रहा हूं [: foo] [: bar] [: baz] + = 1) –

उत्तर

54

आप Hash.new समारोह एक ब्लॉक जिसका कोई डिफ़ॉल्ट मान मामले में पूछे मूल्य अभी मौजूद नहीं है उपज के लिए मार डाला जाता है पारित कर सकते हैं।

/संपादित करें: वाह, an article इस सवाल का जवाब दे रहा है।

पूर्णता के लिए के लिए, यहाँ मनमाना गहराई हैश के लिए लेख से समाधान है:

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)})) 

क्रेडिट Data Noise से केंट में जाते हैं।

+1

वाह। यह प्रभावशाली है। –

+0

मृत लिंक। हालांकि प्रभावशाली समाधान। –

+1

मृत लिंक यहां स्विच किया गया है http://inquirylabs.com/blog2009/2006/09/20/ruby-hashes-of-arbitrary-depth/ – Autodidact

4

ऑटोविविफिकेशन, जैसा कि इसे कहा जाता है, दोनों एक आशीर्वाद और शाप है। समस्या यह हो सकती है कि यदि आप परिभाषित होने से पहले किसी मूल्य पर "देखें", तो आप इस खाली हैश के साथ स्लॉट में फंस गए हैं और आपको इसे बाद में छीनना होगा।

आप अराजकता का एक सा कोई आपत्ति नहीं है, तो आप हमेशा बस में शैली घोषणाओं जो आप के रूप में आप यह क्वेरी की उम्मीद संरचना का निर्माण करने की अनुमति देगा या-बराबर होती है जाम कर सकते हैं:

((h ||= { })['w'] ||= { })['z'] 
संबंधित मुद्दे