如何将 Ruby Hash 转换为 YAML 并保留注释?
对于以下 ruby 示例
require 'yaml'
h = {
# The garage in Miami
'garage_A' => {
'car_x' => {
# Bought in Gotham
'name' => 'Batmobile',
'color' => 'black'
}
},
'garage_B' => {
# Mike's bike
'bike_m' => {
# Cherry red
'color' => 'red',
'wheels' => 2
}
}
}
puts YAML.dump(h)
我希望获得以下结果:
---
# The garage in Miami
garage_A:
car_x:
# Bought in Gotham
name: Batmobile
color: black
garage_B:
# Mike's bike
bike_m:
# Cherry red
color: red
wheels: 2
这是我目前得到的:
---
garage_A:
car_x:
name: Batmobile
color: black
garage_B:
bike_m:
color: red
wheels: 2
我也可能对反向操作感兴趣。
用例:具有工具默认配置的 Ruby 哈希。当配置文件不存在时,它将哈希转储到 YAML 并写入配置文件。为了用户友好性,最好在配置文件中添加注释,而不是必须参考文档。
您确实应该将 YAML 文件模板化为此处文档,或者使用像 erb 这样的模板语言。如果可能的话,您还应该为 Hash 元素使用更多能够揭示意图的名称,这样就不需要注释了。
如果您确实需要注释,请记住 JSON 和 Ruby Hash 对象本身都不支持注释作为其语法的一部分。因此,您需要为 Ruby Hash 中的每个嵌套对象创建一个“注释”键/值对,以便在您生成的 JSON 或 YAML 中显示它。例如:
require "yaml"
# Assign a comment key to each nested element.
hash_with_comments = {
"comment" => "nested hashes contain 'comment' keys",
"garage_a" => {
"comment" => "The garage in Miami",
"car_x" => {
"comment" => "Bought in Gotham",
"name" => "Batmobile",
"color" => "black",
}
}
}
现在
hash_with_comments.to_yaml
将产生以下 YAML:
---
comment: nested hashes contain 'comment' keys
garage_a:
comment: The garage in Miami
car_x:
comment: Bought in Gotham
name: Batmobile
color: black
根据您的用例,您可以停在那里,忽略解析 YAML 的任何代码中的注释键。否则,您可以使用 String#gsub 块语法(必须使用块以避免污染不匹配行的
$1
)将注释元素转换为实际注释。将注释键转换为实际注释后,调用 hash_with_comments.to_yaml.gsub(/^(\s*)comment:/) { "#{$1}#" }
将产生以下 YAML:
---
# each Hash contains a 'comment' key
garage_a:
# The garage in Miami
car_x:
# Bought in Gotham
name: Batmobile
color: black