2010-12-10 3 views
31

में एक हैश के अंदर किसी सरणी को प्रारंभ कर सकते हैं मुझे लगता है कि मैं कर सकते हैंमैं कैसे रूबी

@my_hash = Hash.new(Array.new) 

ऐसे सरणियों की एक हैश को प्रारंभ करने की कोशिश कर रहा हूँ ताकि:

@my_hash["hello"].push("in the street") 
=> ["in the street"] 
@my_hash["hello"].push("at home") 
=> ["in the street", "at home"] 
@my_hash["hello"] 
=>["in the street", "at home"] 

समस्या यह है कि किसी भी नए है हैश कुंजी भी ["in the street", "at home"]

@my_hash["bye"] 
=> ["in the street", "at home"] 
@my_hash["xxx"] 
=> ["in the street", "at home"] 

!!! ???

मैं गलत क्या कर रहा हूं क्या Arrays के हैश को शुरू करने का सही तरीका होगा?

+0

संबंधित: http://stackoverflow.com/questions/190740/setting-ruby-hash-default-to-a-list – tokland

उत्तर

83
@my_hash = Hash.new(Array.new) 

यह ठीक एक सरणी वस्तु है, जो हर बार एक चाबी नहीं मिला है लौटा दिया जाता है बनाता है। चूंकि आप केवल उस सरणी को कभी भी म्यूट करते हैं और कभी भी एक नया नहीं बनाते हैं, इसलिए आपकी सभी चाबियाँ उसी सरणी पर मैप करती हैं।

आप क्या करना चाहते हैं:

@my_hash = Hash.new {|h,k| h[k] = Array.new } 

या बस

@my_hash = Hash.new {|h,k| h[k] = [] } 

Hash.new करने के लिए एक ब्लॉक पासिंग अलग है बस 2 तरीकों से एक तर्क पारित करने से:

  1. जब भी कोई कुंजी नहीं मिलती है तो ब्लॉक को निष्पादित किया जाता है। इस प्रकार आपको हर बार एक नई सरणी मिल जाएगी। एक तर्क के साथ संस्करण में, उस तर्क का मूल्यांकन एक बार किया जाता है (new से पहले कहा जाता है) और इसका परिणाम हर बार लौटा दिया जाता है।

  2. h[k] = करके आप वास्तव में हैश में कुंजी डालें। यदि आप ऐसा नहीं करते हैं तो @my_hash[some_key] तक पहुंचने से वास्तव में हैश में डालने के लिए some_key नहीं होगा।

+14

एक पकड़ लिया यहाँ से अवगत होना है कि अब भी * जाँच * एक कुंजी इसे बनाएगी, जो आप नहीं चाहते हैं। इस कारण से मैं कभी-कभी हश सामान्य रूप से (केवल {}) बना देता हूं, और फिर कॉल में सरणी-निर्माण करता हूं, जैसे '(@myhash ["हैलो"] || = [])। धक्का ("सड़क में ")'। –

2

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

hash["key"].push "value" 

आप इसे करने के लिए मूल्यों को आगे बढ़ाने से पहले हैश कुंजी में एक नया संदर्भ में उत्तीर्ण होना ...

hash["key1"] = Array.new 
hash["key1"].push "value1" 
hash["key2"] = Array.new 
hash["key2"].push "value2 

आप इस encapsulating की कोशिश कर सकते अपडेट कर रहे हैं एक सहायक विधि में भी।

7

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

@my_hash = Hash.new { |h, k| h[k] = Array.new } 
संबंधित मुद्दे