Ruby-YAML交互的首选工作流程

时间:2015-09-24 09:20:10

标签: ruby-on-rails ruby refactoring yaml

我刚刚开始研究一个项目,其中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的内容。

您首选的工作流程是什么?

1 个答案:

答案 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