2010-09-07 119 views
5

我有一個紅寶石散列這樣
h = {"a" => "1", "b" => "", "c" => "2"}
現在我有一個評估該哈希,如果找到一個空值一鍵返回true紅寶石功能。我有以下函數始終返回true,即使在哈希的所有鍵都沒有空搜索紅寶石哈希值爲空

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

我在做什麼錯在這裏?請幫助

感謝,ABHI

+2

這工作對我很好。什麼是你看到這個問題的散列的例子(因爲你的'h'確實有一個空值) – DanSingerman 2010-09-07 11:25:57

回答

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)不必要地創建另一個結構。 – 2010-09-07 14:10:19

+0

你說得對,如果更新我的答案。 'include?'不應該遍歷整個哈希,如果它發現nil的一個發生。但是如果你幾乎總是有沒有空值的散列,那麼它根本就不重要,因爲要返回'false',函數必須總是遍歷整個散列。 – jigfox 2010-09-07 14:17:49

+0

當然,任何解決方案都應該在沒有空白時遍歷整個散列。 – 2010-09-07 14:44:32

17

試試這個:如果您使用的是舊1.8.x的紅寶石

+4

你可以做'hsh.each_value.any? &:empty?'在ruby> = 1.8.7中避免將其轉換爲數組。但是這可能只對大型哈希值很重要。 – 2010-09-07 11:50:09

+0

我同意你的意見,使用枚舉器更好。 – Nakilon 2010-09-07 12:08:35

+0

警告:這將在響應'empty?'方法的哈希值上觸發。例如。 'hash_has_blank({a:[]})== true'這可能不是預期的行爲。 @斯坦拉格的建議通常可能更合適。 – Automatico 2015-11-17 20:14:37

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 2010-09-07 18:31:19

+0

如果這是一次性腳本,那很好。但在代碼審查中,我拒絕了一個基本數據結構的猴子補丁,以支持正確的對象建模。 – 2013-04-17 12:43:52