2010-11-27 10 views
11

अगर रूबी हैश में सभी वस्तुओं को परिभाषित कर रहे हैं की जाँच (नहीं के बराबर) के लिए सबसे अच्छा तरीका क्या है?मैं कैसे पुष्टि करते हैश पर सभी तत्वों को परिभाषित कर रहे हैं?

बयान झूठा लौटना चाहिए अगर हैश में कम से कम एक तत्व नहीं के बराबर है।

उत्तर

32

आप हैं कि कोई विधेय एक गणनीय के सभी तत्वों के लिए सच है की जाँच करने के all? उपयोग कर सकते हैं। तो:

hash.values.all? {|x| !x.nil?} 

या

hash.all? {|k,v| !v.nil?} 

आप भी जाँच करना चाहते हैं, सभी कुंजी के रूप में अच्छी तरह से गैर-शून्य कर रहे हैं, आप में संशोधन कर सकते हैं कि करने के लिए:

hash.all? {|k,v| !v.nil? && !k.nil?} 
+6

'सब' स्वचालित रूप से जाँच करता है अगर (सरणी) तत्वों गैर शून्य हैं, इसलिए मूल्य जांच को 'hash.values.all?' में घटाया जा सकता है, और कुंजी + मान 'हैश.flatten.all? 'पर जांचें! –

+2

@glenn: काफी नहीं। यह जांचता है कि वे सच हैं। 'झूठा' शून्य नहीं है, लेकिन यह सच भी नहीं है। – sepp2k

+0

यदि आप रूबी 1.8.7 या बाद में, या रेल पर हैं, तो आप 'कर सकते हैं! हैश.वल्यूज.एनी? (और: शून्य?) '। –

2

Enumerable#all? विधि करता है बिल्कुल आपको क्या चाहिए

10

एक और तरीका है:

!hash.values.include? nil 
+4

बीटीडब्ल्यू, रेल में यह भी बेहतर है: 'हैश.वल्यू.एक्ससी? nil' –

0

एक तत्व (मान) वह यह है कि nil परिभाषित किया गया है। यह nil वस्तु के रूप में परिभाषित किया है।

आप अगर कोई कुंजी है याद आ रही जाँच के लिए इच्छुक रहे हैं, तो निम्न कार्य करें:?

hash = {:key1 => nil, :key2 => 42, :key3 => false} 
keys = [:key1, :key2, :key3] 
all_defined = keys.all?{|key| hash.has_key?(key)} # Returns true 
एक ब्लॉक के बिना
संबंधित मुद्दे