我有像这样的红宝石哈希
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
答案 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