2012-10-22 11 views
31

पर एक सरणी मैपिंग मेरे पास एक सरणी है, और एक फ़ंक्शन जो मान को मान देता है। आखिरकार मैं एक हैशैप बनाना चाहता हूं जिसमें सरणी के मान महत्वपूर्ण मूल्य के रूप में हैं, और f (key_value) के मान के रूप में परिणाम। क्या ब्लॉक का उपयोग करके ऐसा करने के लिए ऐरे के प्रत्येक/मानचित्र के समान, एक साफ, सरल तरीका है?रूबी - हैशैप

तो कुछ है कि

hsh = {} 
[1,2,3,4].each do |x| 
    hsh[x] = f(x) 
end 

के बराबर है, लेकिन लग रहा है और अधिक इस के समान है कि यह आसान है में, और एक पंक्ति?

results = array.map { | x | f(x) } 

उत्तर

22

तुम भी हैश के डिफ़ॉल्ट मान के रूप में कार्य निर्धारित कर सकते हैं:

hash = Hash.new {|hash, key| hash[key] = f(key) } 

तो फिर तुम एक मूल्य देखने जब, हैश की गणना करने और मक्खी पर संग्रहीत होगा।

hash[10] 
hash.inspect #=> { 10 => whatever_the_result_is } 
13

आपको each_with_object की आवश्यकता है।

def f x 
    x * 2 
end 

t = [1, 2, 3, 4].each_with_object({}) do |x, memo| 
    memo[x] = f(x) 
end 

t # => {1=>2, 2=>4, 3=>6, 4=>8} 

एक और एक:

t2 = [1, 2, 3, 4].map{|x| [x, f(x)]} 
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8} 
20

चेक बाहर Hash::[] विधि।

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ] 
+0

एन ओटी कि यह आलसी गणक के साथ काम नहीं करता है, लेकिन रुबी 2.1.0 का '.to_h' करता है। –

5

पहलुओं 'mash (विधि हैश को गणनीय कन्वर्ट करने के लिए) का उपयोग करना: रूबी 2.1 से

[1, 2, 3, 4].mash { |x| [x, f(x)] } 

:

[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h 
63

ध्यान दें कि जब से रूबी 2.1.0 आप भी Array#to_h उपयोग कर सकते हैं , इस तरह:

[1,2,3,4].map{ |x| [x, f(x)] }.to_h 
+1

ऐरे # to_h रूबी 2.0.0 में मौजूद नहीं है, लेकिन रूबी 2.1.0 में मौजूद है। मैंने न्यूनतम संपादन लंबाई प्रतिबंध के कारण इसे प्रतिबिंबित करने के लिए एक संपादन सबमिट किया है (कुछ अन्य बदले हुए वर्णों के साथ)। –

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