2011-06-21 13 views
6

मैं एक ब्लॉक बना सकता हूं जो हैश तत्व निकालेगा और उन्हें स्थानीय चर में बदल देगा, लेकिन मुझे आश्चर्य है कि कोई मूल विधि पहले से मौजूद है या नहीं। कुछ ऐसा:क्या PHP के निकालने के बराबर रूबी है?

extract({ :foo => 'bar', :foo2 => 'bar2' }) 
puts foo # 'bar' 
puts foo2 # 'bar2' 

ध्यान दें कि कुंजी निजी हैं, और इस क्षेत्र को स्थानीय रहने की आवश्यकता है।

{ :foo => 'bar', :foo2 => 'bar2' }.each do |key, value| 
    print key,"\t",value,"\n" 
end 

आउटपुट:

+0

हाँ, ड्रेगन, सच। इस मामले में, कम ड्रेगन क्योंकि सभी निजी और स्थानीय, और काफी अप्रिय हैश var नाम + सदस्यों के टन से निपटने। निकालना आवश्यक नहीं है लेकिन अच्छा है। – glortho

उत्तर

7

आप पास कर सकते हैं:

bar, bar2 = h.values_at :foo, :foo2 

या मुझे लगता है हम कर सकते थे उदाहरण चर में निकालने के लिए हैश का विस्तार करें:

class Hash 
    def extract o 
    each { |k, v| o.instance_variable_set '@' + k.to_s, v } 
    end 
end 

h.extract self 

p [@foo, @foo2] 
+0

मुझे इस बारे में पता नहीं था - जानना अच्छा है, धन्यवाद - लेकिन चाबियों के समूह के साथ यह एक लायक होने के लिए पर्याप्त बचत नहीं होगी, खासकर जब से आप एक महत्वपूर्ण नाम बदलते हैं, तो आप इसे बदलते हैं इस असाइनमेंट में दो बार और जहां भी आपने इसका इस्तेमाल किया है। आप स्थानीय चर नामों को जेनेरिक कर सकते हैं लेकिन यह काफी नहीं है जो मैं उम्मीद कर रहा हूं। संभव नहीं हो सकता है, इस मामले में ... तो यह हो! – glortho

+0

ठीक है, मैंने इसे पूरी तरह से स्वचालित दृष्टिकोण से अपडेट किया है, लेकिन यह आपके स्थानीय-स्कोप नियम का उल्लंघन करता है। – DigitalRoss

+0

हंडी! मुझे आशा है कि यह प्रश्न पूरी तरह उत्तर नहीं दिया जाएगा क्योंकि मैं सभी प्रकार की चाल सीख रहा हूं। :-) – glortho

1

आप प्रत्येक key=>value जोड़ी के माध्यम से चीज़ों को दोहरा each विधि का उपयोग कर सकते हैं

foo  bar 
foo2 bar2 
+0

धन्यवाद, टेडी। मुझे पता है कि मैं इसे एक ब्लॉक में कर सकता हूं। बस एक छोटी-छोटी विधि की तलाश में है। – glortho

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