2012-11-21 17 views
5

से एक कुंजी हटाने का विनाशकारी तरीका हैश से एक महत्वपूर्ण मूल्य जोड़ी हटाने का कोई विनाशकारी तरीका है?हैश

उदाहरण के लिए, अगर तुमने किया था

original_hash = {:foo => :bar} 
new_hash = original_hash 
new_hash = new_hash.reject{|key, _| key == :foo} 

या

original_hash = {:foo => :bar} 
new_hash = original_hash 
new_hash = new_hash.dup 
new_hash.delete(:foo) 

तो original_hash अपरिवर्तित है, और new_hash बदल गया है, लेकिन वे एक बालक वर्बोज़ कर रहे हैं। हालांकि, अगर आप किया

original_hash = {:foo => :bar} 
new_hash = original_hash 
new_hash.delete(:foo) 

तो original_hash बदल गया है, जो नहीं है कि मैं क्या चाहता हूँ।

क्या कोई ऐसी विधि है जो मैं चाहता हूं?

+2

'original_hash' * *' delete_if' का उपयोग करके आपके पहले उदाहरण में बदला गया है। साथ ही, 'हटाएं' का उपयोग करके आपके दूसरे उदाहरण में 'new_hash'' 'foo'' से संबंधित मान प्राप्त करता है, यानी 'bar', हैश स्वयं ही नहीं। –

+0

@shioyama इसके लिए धन्यवाद! > _ < –

उत्तर

8

ActiveSupport एक हैश विस्तार प्रदान करता है: Hash#except। यह आपको मूल संशोधित किए बिना निर्दिष्ट कुंजी को छोड़कर एक नया हैश वापस करने की अनुमति देता है।

मान लिया जाये कि आप active_support मणि स्थापित किया है:

ruby-1.9.3> require 'active_support/core_ext/hash/except.rb' 
=> true 
ruby-1.9.3> a = {x: 2, y: 1, z: 3} 
=> {:x=>2, :y=>1, :z=>3} 
ruby-1.9.3> b = a.except(:x) 
=> {:y=>1, :z=>3} 
ruby-1.9.3> c = a.except(:x, :y) 
=> {:z=>3} 
ruby-1.9.3> a 
=> {:x=>2, :y=>1, :z=>3} 
ruby-1.9.3> b 
=> {:y=>1, :z=>3} 
ruby-1.9.3> c 
=> {:z=>3} 
+1

मैं ActiveSupport का उपयोग नहीं करता, लेकिन तथ्य यह है कि वे इस तरह की विधि प्रदान करते हैं, यह सबूत है कि रूबी के पास ऐसी कोई विधि नहीं है। –

1

समस्या यह है कि new_hash एक संदर्भ है जब तक कि आप स्पष्ट रूप से ऑब्जेक्ट को डुप्लिकेट करने के लिए रूबी को नहीं बताते। आप dup का उपयोग कर सही रास्ते पर कर रहे हैं, केवल एक चीज है मेरा सुझाव है हो सकता है

new_hash = original_hash.dup 

क्या करना है क्योंकि मैं आप क्या कर रहे बारे में thats अधिक स्पष्ट लगता है।

0

इसे कम वर्बोज़ बनाने के लिए डुप्लिकेट करने के बारे में क्या?

new_hash = original_hash.dup.delete_if{|key, _| key == :foo} 
13

हाँ, आप reject हैं:

new_hash = original_hash.reject{|key, _| key == :foo} 
0
original_hash.clone.tap {|h| h.delete key} 

tap यकीनन कम एक नया वेरिएबल घोषित करने, ज्यादातर क्योंकि यह एक ही लाइन पर है की तुलना में भद्दा है।

clone, मुझे लगता है कि dup की तुलना में अधिक स्पष्ट रूप से एक फ्लैट प्रति है, हालांकि निश्चित रूप से हैश के लिए यह थोड़ा अंतर बनाता है।

+0

जबकि यह कोड स्निपेट प्रश्न हल कर सकता है, [एक स्पष्टीकरण सहित] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। – DimaSan