我正在寻找一种方法来发出yaml文件,避免使用别名(主要是为了简化人类可读性)。我认为扩展Psych::Visitors::Emitter
或Psych::Visitors::Visitor
是一种方法,但我实际上找不到ruby决定是完全转储锚还是使用别名引用锚的位置。
我甚至不介意锚被反复使用(用它们的&……我只需要将别名扩展到完整的结构。
我知道过去也有类似的问题,但是:
Ruby YAML write without aliases仍未答复
Is it possible to emit valid YAML with anchors / references disabled using Ruby or Python?为python而不是ruby给出了答案
最佳答案
我找到的唯一方法是对被转储到yaml的对象执行深度克隆。这是因为yaml将根据锚和别名的标识来标识锚和别名,如果您clone
或dup
它们,则新对象将相等,但具有不同的标识。
有很多方法可以执行深度克隆,包括库支持,或者编写自己的助手函数——我将留给读者作为练习。