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