2010-09-07 16 views
5

के लिए मैं इस
h = {"a" => "1", "b" => "", "c" => "2"}
की तरह एक गहरे लाल रंग का हैश है अब मैं एक गहरे लाल रंग का समारोह है जो इस हैश मूल्यांकन करता है और अगर यह एक खाली मूल्य के साथ एक प्रमुख पाता सच रिटर्न दिया है। मैं निम्नलिखित समारोह जो हमेशा सच रिटर्न भले ही हैश में सभी चाबियाँ खाली नहीं हैंखोजें माणिक हैश रिक्त मान

def hash_has_blank(hsh) 
    hsh.each do |k,v| 
    if v.empty? 
     return true 
    end 
    end 
    return false 
end 

क्या मैं गलत यहाँ कर रहा हूँ? कृपया मदद

धन्यवाद, अभि

+2

यह मेरे लिए ठीक काम करता है।एक हैश का उदाहरण क्या है जहां आप इस समस्या को देख रहे हैं (क्योंकि आपके 'एच' में रिक्त मान है) – DanSingerman

उत्तर

8

मुझे आशा है कि 'प्रयोग कर रहे हैं

def hash_has_blank hsh 
    hsh.values.any?{|i|i.empty?} 
end 

:

def hash_has_blank hsh 
    hsh.values.any? &:empty? 
end 

या यहां कुछ रूबी जादू सीखने के लिए तैयार हैं। मैं आपके जैसे वैश्विक रूप से इस तरह के एक समारोह को परिभाषित नहीं करता। यदि यह एक हैश पर एक ऑपरेशन है, की तुलना में यह हैश वर्ग पर एक उदाहरण विधि आप इसे इस तरह से कर सकते हैं होना चाहिए:

class Hash 
    def has_blank? 
    self.reject{|k,v| !v.nil? || v.length > 0}.size > 0 
    end 
end 

reject सभी रिक्त स्ट्रिंग के साथ एक नया हैश वापस आ जाएगी, और की तुलना में यह हो जाएगा यह जांचें कि यह नया हैश कितना बड़ा है।

एक संभवतः अधिक कुशल तरीका (यह पूरी सरणी पार नहीं होना चाहिए):

class Hash 
    def has_blank? 
    self.values.any?{|v| v.nil? || v.length == 0} 
    end 
end 

लेकिन यह अभी भी पूरी हैश पार किए जाने, अगर वहाँ कोई रिक्त मान

मैं बदल दिया है है empty? से !nil? || length >0 क्योंकि मुझे नहीं पता कि आपकी empty विधि कैसे काम करती है।

+1

आप जितने कुशल नहीं हैं 1) पूरे हैश को पार करते हुए, और 2) एक और संरचना अनावश्यक रूप से बनाते हैं। –

+0

यदि आप मेरा उत्तर अपडेट करते हैं, तो आप सही हैं। 'शामिल है?' को पूरे हैश को पार नहीं करना चाहिए, अगर उसे शून्य की घटना मिलती है। लेकिन यदि आपके पास लगभग हमेशा हैश हैं जिनके पास खाली मूल्य नहीं हैं, तो इससे कोई फर्क नहीं पड़ता, क्योंकि 'झूठी' वापस करने के लिए, फ़ंक्शन हमेशा पूरे हैश को पार कर लेना चाहिए। – jigfox

+0

बेशक कोई रिक्त स्थान होने पर किसी भी समाधान को पूरे हैश को पार करना चाहिए। –

17

इस प्रयास करें: आप एक पुराने 1.8.x रूबी

+4

आप 'hsh.each_value.any कर सकते हैं? &: खाली? 'ruby> = 1.8.7 में इसे एक सरणी में कास्टिंग से बचने के लिए। लेकिन यह केवल बड़े हैश के लिए महत्वपूर्ण हो सकता है। –

+0

मैं आपके साथ सहमत हूं, गणक का उपयोग करना बेहतर है। – Nakilon

+0

चेतावनी: यह हैश मानों पर ट्रिगर होगा जो 'खाली 'विधि का जवाब देंगे। उदाहरण के लिए। 'हैश_हास_ब्लैंक ({ए: []}) == सत्य 'जो अपेक्षित व्यवहार नहीं हो सकता है। @ स्टीन्सलैग का सुझाव अक्सर अधिक उपयुक्त हो सकता है। – Automatico

4

तुम सिर्फ अगर कोई भी मान एक रिक्त स्ट्रिंग है जाँच करना चाहते हैं आप

h.has_value?('') 

कर सकता है, लेकिन अपने कार्य ठीक से काम करने लगता है।

4

मैं आपके मॉडल डोमेन को पुन: सक्रिय करने पर विचार करता हूं। जाहिर है हैश कुछ मूर्त रूप का प्रतिनिधित्व करता है। इसे एक वस्तु क्यों नहीं बनाते? यदि आइटम को हैश द्वारा पूरी तरह से प्रदर्शित किया जा सकता है, तो आप हैश को उप-वर्ग करना चाहेंगे। यदि यह अधिक जटिल है, हैश एक विशेषता हो सकती है।

दूसरा, जिस कारण से आप रिक्त स्थान की जांच कर रहे हैं उसका नाम आपके डोमेन को बेहतर ढंग से प्रतिबिंबित करने के लिए किया जा सकता है। आपने हमें "क्यों" नहीं बताया है, लेकिन मान लीजिए कि आपका आइटम केवल तभी मान्य है जब उसके पास कोई रिक्त मूल्य न हो।

class MyItem < Hash 

    def valid? 
    !invalid? 
    end 

    def invalid? 
    values.any?{|i| i.empty?} 
    end 
end 

बिंदु यदि आप एक शब्दावली है कि आपके डोमेन में समझ में आता है स्थापित कर सकते हैं, अपने कोड क्लीनर और अधिक समझ में आता हो जाएगा, है। हैश का उपयोग करना सिर्फ एक साधन है और आप अधिक वर्णनात्मक, डोमेन-विशिष्ट शर्तों का उपयोग करना बेहतर होगा।

ऊपर के उदाहरण का उपयोग करना, आप ऐसा करने में सक्षम हो जाएगा:

my_item = MyItem["a" => "1", "b" => "", "c" => "2"] 

my_item.valid? #=> false 
+0

यह करने का एक साफ तरीका है। jigfox का समाधान यह मेरे लिए करता है – eabhvee

+0

अगर यह एक थ्रो स्क्रिप्ट था, तो ठीक है। लेकिन एक कोड समीक्षा में, मैं उचित ऑब्जेक्ट मॉडलिंग के पक्ष में मूल डेटा संरचना के बंदर पैच को अस्वीकार कर दूंगा। –

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