当我用Ruby解析YAML时,它会更改我的锚名称

当我用Ruby解析YAML时,它会更改我的锚名称,ruby,anchor,yaml,Ruby,Anchor,Yaml,我有这样一个YAML文件: - axis: &kadeployversion type: user-defined name: kadeployversion values: - kadeploy3 - kadeploy3-dev require 'yaml' jjb = YAML.load_file(fileToParse) jjb[0]['type']='test' File.open(fileToParse, 'w+'){ |f| f.

我有这样一个YAML文件:

    - axis: &kadeployversion
   type: user-defined
   name: kadeployversion
   values:
    - kadeploy3
    - kadeploy3-dev
require 'yaml'
jjb = YAML.load_file(fileToParse)
jjb[0]['type']='test'
File.open(fileToParse, 'w+'){
 |f| f.write jjb.to_yaml
}
我用Ruby编辑了这个文件,如下所示:

    - axis: &kadeployversion
   type: user-defined
   name: kadeployversion
   values:
    - kadeploy3
    - kadeploy3-dev
require 'yaml'
jjb = YAML.load_file(fileToParse)
jjb[0]['type']='test'
File.open(fileToParse, 'w+'){
 |f| f.write jjb.to_yaml
}
但当我阅读我的新文件时,我发现:

    - axis: &12345678
   type: test
   name: kadeployversion
   values:
    - kadeploy3
    - kadeploy3-dev

它可以工作,但我想保留我原来的主播名称,否则它将无法读取。有什么想法吗?

您可以通过以下方法实现:

解释 这不可能使用标准加载/转储,因为标签信息丢失。再次转储解析的YAML时发生的情况相当于:

a = [3]
puts({"version"=>a, "axis"=>a}.to_yaml)

###

---
version: &1
- 3
axis: *1
将应用任意ID来标记对象

但你并不是运气不好!通过深入精神科,这些数据是存在的,你可以利用它们

yaml = <<EOS
version: &kadeployversion
 - 3
axis: *kadeployversion
type: something
EOS

puts Psych.parse_stream(yaml).to_yaml
###
version: &kadeployversion
- 3
axis: *kadeployversion
type: something

yaml=我正在研究一个我认为可以解决这一问题的答案,但是您能否将您的样本输入/输出更新为有效的yaml片段,以便我们可以使用它们作为实际的测试输入,以确保我们回答了正确的问题?谢谢,伙计!我不得不说,文档是糟糕透顶的,尤其是在示例部,除了琐碎的任务之外,什么都可以做。“AST可以自由修改”的想法比实际快速解决实际问题所需的少。你的例子填补了我遇到的不清楚的问题。