Ruby方法在递归块中不返回False

时间:2017-11-02 05:36:49

标签: ruby

我正在做我在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。我仍然是一个红宝石新手,所以我很乐意感谢任何有关正确主题的建议和指导,我应该接受这个挑战。

1 个答案:

答案 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)实际上已被丢弃。

顺便说一句,在风格方面,我建议只使用三元表达单行表达式,同时也要努力保持一致的缩进。