Ruby-YAML 交互的首选工作流
Preferred Workflow for Ruby-YAML interaction
我刚刚开始从事一个项目,其中 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
。
您首选的工作流程是什么?
如果您使用的是 rails,他们已将方法 try
添加到 Object。对于 nil 对象,这将始终 return 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
我刚刚开始从事一个项目,其中 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
。
您首选的工作流程是什么?
如果您使用的是 rails,他们已将方法 try
添加到 Object。对于 nil 对象,这将始终 return 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