2012-07-21 15 views
10

के साथ हैश में जोड़कर मैंने निम्नलिखित रूबी कोड की कोशिश की, जिसे मैंने सोचा था कि उन लंबाई के साथ शब्दों की लंबाई लंबाई का हैश वापस कर देगा। इसके बजाय यह खाली है।रूबी सरणी मान

map = Hash.new(Array.new)  
strings = ["abc","def","four","five"] 
strings.each do |word| 
    map[word.length] << word 
end 

हालांकि, अगर मैं इसे

map = Hash.new 
strings = ["abc","def","four","five"] 
strings.each do |word| 
    map[word.length] ||= [] 
    map[word.length] << word 
end 

यह काम करता है के लिए संशोधित।

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

+0

यह अजीब है। पहले उदाहरण के लिए, यह काम करता है अगर आप 'map = हैश.न्यू {| एच, के | एच [के] = []} ' –

उत्तर

21

समस्या यह है कि आप वास्तव में हैश कुंजी को कुछ भी निर्दिष्ट नहीं कर रहे हैं, आप केवल डिफ़ॉल्ट मान की मौजूदा सामग्री को संशोधित करने के लिए << ऑपरेटर का उपयोग कर रहे हैं। चूंकि आप हैश कुंजी को कुछ भी निर्दिष्ट नहीं करते हैं, इसलिए यह जोड़ा नहीं जाता है। वास्तव में, आप ध्यान देंगे डिफ़ॉल्ट मान एक संशोधित है:

h = Hash.new [] 
p h[0]   # [] 
h[0] << "Hello" 
p h    # {} 
p h[0]   # ["Hello"] 
p h[1]   # ["Hello"] 

इसका कारण यह है एक ही Array वस्तु डिफ़ॉल्ट मान के रूप में रखा जाता है। तुम्हें पता है, + ऑपरेटर का उपयोग करके इसे ठीक कर सकते हैं, हालांकि यह कम कुशल हो सकता है:

map = Hash.new [] 
strings = ["abc", "def", "four", "five"] 

strings.each do |word| 
    map[word.length] += [word] 
end 

और अब यह अपेक्षा के अनुरूप काम करता है।

+0

मुझे बहुत मदद की, धन्यवाद! यह तब तक मेरे लिए काम नहीं करता जब तक कि मैंने 'शब्द' को '+ =' के बाद सरणी नहीं किया, जैसे '[शब्द] ' – Subtletree

2

मुझे लगता है कि पहला संस्करण वास्तव में क्या मतलब है कि डिफ़ॉल्ट मान केवल एक सरणी है। दूसरा उदाहरण स्पष्ट रूप से एक नया सरणी बनाता है यदि कोई अभी तक अस्तित्व में नहीं है।

यह clarify पर एक अच्छा पढ़ने जैसा दिखता है।

+0

आह, मैं देखता हूं। यह समझ आता है। –

11

किसी भी मामले में, आप Enumerable#group_by उपयोग करना चाहिए:

["abc", "def", "four", "five"].group_by(&:length) 
#=> {3=>["abc", "def"], 4=>["four", "five"]} 
+0

धन्यवाद। मैं अभी भी रूबी सीख रहा हूं इसलिए मुहावरे सीखना सहायक है। –

+0

शानदार, धन्यवाद! – Johnsyweb

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