如何将以下代码减少为ruby中的一行?
unless(data["location"].nil?)
unless(data["location"]["country"].nil?)
unless(data["location"]["country"]["code"].nil?)
#some codes
end
end
end
答案 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"