搜索ruby哈希值为空值

时间:2010-09-07 11:18:49

标签: ruby

我有像这样的红宝石哈希 h = {"a" => "1", "b" => "", "c" => "2"}
现在我有一个ruby函数来计算这个哈希,如果找到一个空值的键,则返回true。我有以下函数,即使哈希中的所有键都不为空,总是返回true

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

我在这里做错了什么?请帮忙

谢谢,Abhi

4 个答案:

答案 0 :(得分:18)

试试这个:

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

或者:

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

如果您使用的是旧的1.8.x Ruby

答案 1 :(得分:8)

我希望你准备好在这里学习一些红宝石魔法。我不像你那样全局定义这样的函数。如果它是对散列的操作,那么它应该是Hash类上的实例方法,你可以这样做:

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方法是如何运作的。

答案 2 :(得分:5)

如果您只是想检查是否有任何值是空字符串,您可以

h.has_value?('')

但你的功能似乎工作正常。

答案 3 :(得分:4)

我会考虑重构您的模型域。哈希显然代表了一些有形的东西。为什么不把它作为一个对象?如果项目可以完全用散列表示,您可能希望子类化Hash。如果它更复杂,则哈希可以是属性。

其次,您可以命名检查空白的原因,以便更好地反映您的域名。您没有告诉我们“为什么”,但我们假设您的商品只有在没有任何空白值时才有效。

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