我刚刚开始研究一个项目,其中Ruby和5-6级深度YAML文件之间存在大量交互。由于Ruby在您尝试访问不存在的密钥时将使用NoMethodError: undefined method '[]' for nil:NilClass
进行响应,因此有许多方法可以进行以下设置:
def retrieve_som_data(key1, key2)
results = []
if data(key1, key2)
if data_set_2(key, key2)["my_key"]
results = data_set_2(key, key2)["my_other_key"]
end
end
return results.clone
end
这看起来很可怕,所以我正在寻找一种重构它的方法。我试过一个版本,我将替换这样的方法:
def data(key1, key2)
if data = names_data(key1)
return data[key2]
end
end
代之以:
def data(key1, key2)
names_data(key1).fetch(key2)
end
这引发了一个更具体的错误KeyError
,这可以在任何调用.data()
的方法中获救并采取行动,但这似乎也不是一个好的解决方案可读性。
我希望得到一些关于您如何处理尝试访问YAML_DATA[key][key1][key2][key3][key4]
的情况的输入,并考虑到任何提供的密钥都可能会遇到nil
的内容。
您首选的工作流程是什么?
答案 0 :(得分:0)
如果您正在使用rails,他们已向Object添加了try
方法。对于nil对象,这将始终返回nil,而不是抛出,因此您可以按照以下方式执行操作:
def get_yaml_obj(yaml_data, key1, key2, key3)
yaml_data.try(:[], key1).try(:[], key2).try(:[], key3)
end
或者,如果你有一个任意数量的键:
def get_data(yaml_data, keys)
keys.each do |key|
yaml_data = yaml_data.try(:[], key)
end
yaml_data
end