在Ruby中,加载YAML文档时,如何警告哈希中存在重复键?

在Ruby中,加载YAML文档时,如何警告哈希中存在重复键?,ruby,yaml,Ruby,Yaml,在下面的Ruby示例中,是否有一种模式让YAMLNOT自动忽略重复键“one” irb(main):001:0> require 'yaml' => true irb(main):002:0> str = '{ one: 1, one: 2 }' => "{ one: 1, one: 2 }" irb(main):003:0> YAML.load(str) => {"one"=>2} 谢谢 否。您必须决定如何重命名键,因为散列键必须是唯一的-我会采取一

在下面的Ruby示例中,是否有一种模式让YAMLNOT自动忽略重复键“one”

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> str = '{ one: 1, one: 2 }'
=> "{ one: 1, one: 2 }"
irb(main):003:0> YAML.load(str)
=> {"one"=>2}

谢谢

否。您必须决定如何重命名键,因为散列键必须是唯一的-我会采取一些变通方法,比如手动查找相同的键,并在执行
YAML::load

之前重命名它们,这是我帮助维护我使用的YAML文件所做的事情之一,是编写代码从Ruby中的已知结构开始生成它。这让我开始了

然后,我将编写一个小片段,加载它并输出它使用或解析的内容,以便将其与文件进行比较


我还根据需要对字段进行排序,以便于查找重复项。

有一种解决方案涉及到一个过梁,但我不确定它是否与 因为它不是一个100%的Ruby解决方案,所以您可以使用它。既然我不知道,我还是会把它贴出来的 在Ruby中实现这一点的任何方法:

您可以使用命令行工具:

sudo pip install yamllint
具体来说,它有一个规则
密钥重复
,用于检测重复的密钥:

$ cat test.yml
{ one: 1, one: 2 }

$ yamllint test.yml
test.yml
  1:11      error    duplication of key "one" in mapping  (key-duplicates)

使用Psych,您可以遍历AST树以找到重复的键。我在测试套件中使用以下帮助器方法来验证我的i18n翻译中是否没有重复的键:

def重复密钥(文件或内容)
yaml=文件或内容。文件是?(文件)吗?文件或内容。读取:文件或内容
重复的_键=[]
验证程序=->(节点,父路径)do
if node.is_a?(Psych::Nodes::Mapping)
children=node.children。映射中的每个_切片(2)#中,每个其他子节点都是关键节点,另一个是值节点。
duplicates=children.map{| key|u node,| value|u node | key|u node}.group|u by(&:value)。选择{| | value,nodes | nodes.size>1}
重复。每个do |键,节点|
重复密钥={
file:(file_或_content.path,如果file_或_content.is_是?(文件)),
key:parent_path+[key],
引用:nodes.map{|引用|“line:{occurrence.start_line+1}},
}.紧凑型

重复的钥匙谢谢。这是非常有用的!