【问题标题】:How can I attempt to iterate a Hash in Ruby when the object may be nil?当对象可能为零时,如何尝试在 Ruby 中迭代哈希?
【发布时间】:2019-03-12 02:23:16
【问题描述】:

我发现自己必须一直这样做,而当我赶时间时,我会将其包装在一个条件句中:

if !myhash.blank?
  hash.each do |k,v|
    do_something
  end
end

或:

myhash.map{|k,v| do_something} unless myhash.blank?

一定有更干净的东西。

【问题讨论】:

  • 您可以使用您设置的“null”哈希来返回一些可接受的默认值。也就是说,您将哈希定义为hash = my_hash || default_hash。那么每次引用my_hash就不需要条件了;就在它第一次定义的时候。
  • 由于空散列是一个可以循环的很好的值,你不需要blank?:if myhash
  • 如果你有nil,你期望Hash,这是一个错误,正确的反应是修复错误,这样你就不会得到nil,而不是解决nil!如果你“发现自己必须一直这样做”,那么你就有很多错误,你应该加强你的设计、开发、测试、代码审查和 QA 流程(以及,最终,你的招聘流程,所以你不会雇佣那些一开始就写出如此愚蠢的错误的程序员)!
  • 非常感谢乔格。我在家为我的业务编写代码。对不起,我太傻了。但既然我们是在给出建议,我对你的建议是要注意你的举止。我不在乎你的分数是多少,你的傲慢正在表现出来。

标签: ruby


【解决方案1】:

我倾向于使用to_h 来隐藏“是不是nil”测试:

hash.to_h.each do |k,v|
  # something
end

如果hash 已经是一个哈希,那么hash.to_h 就是hash,如果hash.nil? 那么hash.to_h 就是{ }

同样,我将to_a 用于数组:

array.to_a.each { |e| ... }

to_s 用于字符串,to_i 用于整数(当我想将 nil 视为零时),...

【讨论】:

    【解决方案2】:

    我可能会这样做:

    (my_hash || {}).each do |k, v|
      # something
    end
    

    或者这个:

    my_hash ||= {}
    my_hash.each do |k, v|
      # something
    end
    

    【讨论】:

    • +1 表示第一个 sn-p。我不能说我喜欢第二个,但是,变量重新绑定不太好。也许稍后在方法中您将需要 my_hash 的原始值。
    【解决方案3】:

    如果你想专门迭代,如果不是 nil,你可以做类似的事情

    hash && hash.each do |x|
      # do something
    end
    

    但我发现unless hash.nil? 更具表现力。

    【讨论】:

      【解决方案4】:

      如果你使用rails,你可以说:

      my_hash.try(:each) do |key, value|
        # code
      end
      

      如果在nil 上调用,try 将返回nil 如果接收方没有响应该方法。

      【讨论】:

        【解决方案5】:
        Hash(myhash).each {|k,v| # whatevs }
        

        始终返回Hash。修改自:https://stackoverflow.com/a/18894072/1076207

        irb 测试:

        # $ irb
        # irb(main):001:0> Hash(myhash=nil).each {|k,v|}
        # => {}
        # irb(main):002:0> Hash(myhash={"a" => "b"}).each {|k,v|}
        # => {"a"=>"b"}
        

        【讨论】:

        • 为什么投反对票? “如果您认为这篇文章可以改进,请考虑添加评论。”
        猜你喜欢
        • 1970-01-01
        • 2018-12-29
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多