如何将以下代码减少为ruby中的一行?

时间:2011-07-13 07:15:13

标签: ruby-on-rails ruby ruby-on-rails-3

如何将以下代码减少为ruby中的一行?

unless(data["location"].nil?)
  unless(data["location"]["country"].nil?)
    unless(data["location"]["country"]["code"].nil?)
      #some codes
    end
  end  
end

7 个答案:

答案 0 :(得分:10)

if data["location"] && data["location"]["country"] && data["location"]["country"]["code]

Ruby的&&运算符是一个短循环运算符,因此如果第一个操作数为false,它将停止处理剩余的条件。此外。任何不是nil的对象都是(出于布尔目的)true,所以如果密钥存在,那么它是true

答案 1 :(得分:3)

您可以使用try方法,Rails 2.3支持此方法,并且具有Ruby 1.9的本机支持。

if data.try(:[],'location').try(:[],'country').try(:[],'code')
 ...
end

答案 2 :(得分:1)

总有好老...

 if (data["location"]
     and data["location"]["country"] 
     and data["location"]["country"]["code"]) 
     # some code
 end

答案 3 :(得分:1)

你可以拿出大枪并使用the andand gem。这不是一个生产建议(甚至对于现实生活来说非常严重),但它非常吸引人并直接满足您的需求。 使用andand即可

data['location'].andand['country'].andand['code']

你会得到一个关于取消定义object_id及其如何导致严重问题的奖励警告,但只是微笑并享受元编程:)

答案 4 :(得分:1)

我知道这是邪恶的,但对我来说已经很晚了......

class NilClass
  def [](args=""); self; end
end

if data["location"]["country"]["code"]
  # robot armies eat your pancakes
end

答案 5 :(得分:0)

答案

!data["location"].nil? && !data["location"]["country"].nil? && !data["location"]["country"]["code"].nil? && #some codes

但为什么?

答案 6 :(得分:0)

向Hash类添加方法

class Hash

  def all_keys

     keys = []

     each_pair do |k1, v1|

     if v1.is_a?(Hash)

        v1.each_pair { |k2, v2|
           if !v2.is_a?(Hash) then keys << [k1, k2]; next end
        v2.each_pair { |k3, v3|
           if !v3.is_a?(Hash) then keys << [k1, k2, k3]; next end
        v3.each_pair { |k4, v4|
           if !v4.is_a?(Hash) then keys << [k1, k2, k3, k4]; next end
        v4.each_pair { |k5, v5|
           if !v5.is_a?(Hash) then keys << [k1, k2, k3, k4, k5]; next end
        v5.each_pair { |k6, v6|
           if !v6.is_a?(Hash) then keys << [k1, k2, k3, k4, k5, k6]; next end
           # add more v[n].each_pair ... loops to process more hash dimensions
        } } } } }      # "}" * 5

        else
           keys << [k1]
        end

     end

    keys

 end

end

现在,使用此代码检查嵌套密钥是否存在:

data.all_keys.first.include? "code"