如何在Ruby扩展别名中发出YAML

我正在寻找一种方法来发出YAML文件,避免使用别名(主要是为了简化人类的可读性)。 我认为扩展Psych::Visitors::EmitterPsych::Visitors::VisitorPsych::Visitors::Visitor的方法,但我实际上无法找到Ruby决定是否完全转储锚点,或者使用别名引用它。

我甚至不介意锚是否被重复使用(使用&……引用),我只需要将别名扩展到完整结构。

我知道过去曾问过类似的问题,但是:

  • 没有别名的Ruby YAML写入仍未得到答复
  • 是否可以使用Ruby或Python禁用锚点/引用来发出有效的YAML? 给出了Python的答案,但没有给Ruby

我发现这样做的唯一方法是对要转储到YAML的对象执行深度克隆。 这是因为YAML将根据其身份识别锚点和别名,如果您cloneclone它们,新对象将是相同的,但具有不同的标识。

有很多方法可以执行深度克隆,包括库支持,或者编写自己的帮助函数 – 我将把它留作读者练习。

我使用的一种简单(hacky)方法是将yaml转换为json。 然后将其转换回YAML。 新的YAML不包含别名/锚点。

 require 'json' jsonObj = oldYaml.to_json newYaml = YAML.load(jsonObj) print newYaml.to_yaml 
Interesting Posts