【问题标题】:Ruby Method not Returning False within a Recursion BlockRuby 方法在递归块中不返回 False
【发布时间】:2017-11-02 05:36:48
【问题描述】:

我正在做一个我在 rubeque.com 上找到的 ruby​​ 挑战。以下是说明:

说明: 写一个方法#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 。我仍然是一名 ruby​​ 新手,因此对于我应该为这个挑战进行的正确主题的任何建议和指导,我将很高兴。

【问题讨论】:

  • 无法复制。
  • 我的错,Class由于某种原因被大写了..所以它应该是class Hash {..rest of code..},如果还有问题请告诉我

标签: ruby


【解决方案1】:

虽然在另一个内部定义一个方法很酷(我不知道这实际上可能是这样),但该方法可以简化很多:

class Hash
  def r_empty?
    !values.any? do |val|
       val.is_a?(Hash) ? !val.r_empty? : (val && val != "")
    end
  end
end

我不确定问题出在您的原始代码上,但我认为recurse(value) 实际上已被丢弃。

顺便说一句,就样式而言,我建议仅对单行表达式使用三元组,并且要注意缩进的一致性。

【讨论】:

  • 太棒了,它有效!您能给我简要介绍一下您的代码背后的逻辑吗?我还会积极 google 并查找文档以了解您使用的方法。
  • 我使用的唯一没有原始的方法是Hash#values(返回一个数组,类似于Hash#keys)和Enumerable#any?
  • 要理解它,您可以像伪代码一样阅读它:Are none of the values either: a. hashes containing some non-blank value or b. non-blank values?。还要记住,Rails 附带了一个方法 Object#blank?,它涵盖了这个 nil-or-empty-string 用例。
  • !values.any? 可以简化为values.none?
  • @maxpleaner:实际上不可能在内部相互定义方法。语法是有效的,是的,但是内部方法将在与外部方法相同的范围内定义。它不会隐藏在外部方法中(不像其他一些语言)
猜你喜欢
  • 1970-01-01
  • 2012-02-21
  • 2014-11-26
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 2018-09-18
  • 2015-06-30
  • 1970-01-01
相关资源
最近更新 更多