2012-02-02 21 views
29

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

उत्तर

11

आप Hash#fetch विधि का उपयोग कर सकते हैं हैश में उस डिफ़ॉल्ट मान संग्रहीत करने के लिए की जरूरत नहीं है:

hash = {} 
hash.fetch(:some_key, 'default-value') # => 'default-value' 
p hash 
# => {} 

आप इसके अलावा में की जरूरत है अपने डिफ़ॉल्ट मान आप का उपयोग न के बराबर कुंजी हर बार स्टोर करने के लिए और आप

hash = Hash.new { |hash, key| hash[key] = 'default-value' } 
hash[:a] = 'foo' 
p hash[:b] 
# => 'default-value' 
p hash 
# => { :a => 'foo', :b => 'default-value' } 
15

हैश वर्ग के निर्माता एक डिफ़ॉल्ट मान, एक ही है, तो मिलान कुंजी नहीं मिला है लौटा दी जाएगी स्वीकार करते हैं: 'एक हैश आप एक ब्लॉक के साथ Hash#new का उपयोग कर ऐसा कर सकते हैं आरंभ कर रहे हैं।

h = Hash.new("default") 

h.has_key?("jake") 
=> false 

h["jake"] 
=> "default" 

h["jake"] = "26" 
h.has_key?("jake") 
=> true 
43

आप पहले से ही एक हैश है, तो आप ऐसा कर सकते हैं:

h.fetch(key, "default value") 

या आप तथ्य यह है कि एक गैर-मौजूद कुंजी वापस आ जाएगी nil शोषण:

h[key] || "default value" 

बनाने के लिए डिफ़ॉल्ट मानों के साथ हैश यह निर्भर करता है कि आप वास्तव में क्या करना चाहते हैं।

  • कुंजी के स्वतंत्र और संग्रहीत नहीं किया जाएगा:

    h = Hash.new("foo") 
    h[1] #=> "foo" 
    h #=> {} 
    
  • कुंजी पर निर्भर और संग्रहीत किया जाएगा:

    h = Hash.new { |h, k| h[k] = k * k } 
    h[2] #=> 4 
    h #=> {2=>4} 
    
+2

एच [कुंजी] का उपयोग || "डिफ़ॉल्ट मान" सहेजा नहीं जाता है, अगर वहां पहले से ही झूठा है तो इसे – Sebastian

+0

ओवरराइड किया जाएगा इसलिए मैंने इसे कई संभावनाओं में से एक के रूप में सूचीबद्ध किया है। आम तौर पर लोगों को यह पता होता है कि उनके हैंश के मूल्य कैसा रहेगा, अगर आपको पता है कि आप बुलियन मूल्यों को नहीं बचा रहे हैं, तो यह एक बिल्कुल सही दृष्टिकोण है। –

3

आप एक डिफ़ॉल्ट मान भंडारण कर रहे हैं यह शून्य हो सकता है और आपको इसे संग्रहण समय पर गणना करने की आवश्यकता है:

hash = {} 
... 
hash.fetch(key) {|k| hash[k] = calc_default()} 
1

आप अगर कुंजी (अभी तक) मौजूद नहीं है हैश करने के लिए डिफ़ॉल्ट मान देना चाहते हैं, तो आप ||= ऑपरेटर, यानी उपयोग कर सकते हैं:

h = {some_key: 'non_default_value'} 
value = h[:some_key] ||= 'default_value' 
value2 = h[:non_existing_key] ||= 'default_value' 

value'non_default_value' और value2 आवंटित किया जाएगा होगा

: 'default_value'

सौंपा जा इन असाइनमेंट के बाद hnon_existing_key सेट 'default_value' करना होगा

{:some_key=>"non_default_value", :non_existing_key=>"default_value"}

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