我正在做我在rubeque.com上发现的红宝石挑战。以下是说明:
说明: 写一个方法#r_empty?如果散列及其子散列为空,则返回true;如果散列中有值,则返回false。
我的回答:
class Hash
def r_empty?
def recurse(h)
h.each {|key, value|
value.is_a?(Hash) ? recurse(value) :
if (value!=nil && value!="")
#puts value
return false
end
}
return true
end
recurse(self)
end
end
测试:
a = {:ruby => "", :queue => ""}
b = {:ruby => {:version => {:one => {"nine" => ""}, "two" => "=^.^="}},
:html => ""}
c = {:pets => {:dogs => {:my => {"niko" => ""}, "ollie" => ""}}, :cats =>
nil, :mice => ""}
d = {a: "", b: :two, c: ""}
答案:
a.r_empty?, true
b.r_empty?, false
c.r_empty?, true
d.r_empty?, false
({}.r_empty?), true
使用此代码,我能够在5个测试中的4个中得到正确的答案。我的方法为b.r_empty返回TRUE? ...我注意到,如果我取消注释#puts值,则为b.r_empty输出“= ^。^ =”? ...所以if语句正在执行,但最终不返回false。我仍然是一个红宝石新手,所以我很乐意感谢任何有关正确主题的建议和指导,我应该接受这个挑战。
答案 0 :(得分:1)
虽然在另一个方法中定义一个方法很酷(我不知道这可能实际上是这个),但这个方法可以简化一下:
class Hash
def r_empty?
!values.any? do |val|
val.is_a?(Hash) ? !val.r_empty? : (val && val != "")
end
end
end
我不确定您的原始代码是否存在问题,但我认为recurse(value)
实际上已被丢弃。
顺便说一句,在风格方面,我建议只使用三元表达单行表达式,同时也要努力保持一致的缩进。