可以使用Ruby的YAML模块嵌入注释吗?

sut*_*tch 5 ruby yaml to-yaml

to_yaml方法产生不错的YAML输出,但是我想在某些元素之前添加注释行。有办法吗?

例如,我想生产:

# hostname or IP address of client
client: host4.example.com
# hostname or IP address of server
server: 192.168.222.222
Run Code Online (Sandbox Code Playgroud)

从类似于:

{
  :client => 'host4.example.com',
  :server => '192.168.222.222',
}.to_yaml
Run Code Online (Sandbox Code Playgroud)

...但是不确定YAML模块是否有办法实现。

更新:我最终没有使用使用正则表达式插入注释的解决方案,因为它需要将数据与注释分开。对我来说,最简单,最容易理解的解决方案是:

require 'yaml'

source = <<SOURCE
# hostname or IP address of client
client: host4.example.com
# hostname or IP address of server
server: 192.168.222.222
SOURCE

conf = YAML::load(source)

puts source
Run Code Online (Sandbox Code Playgroud)

对我来说,好处是无需重复任何操作(例如,“ client:”仅指定一次),数据和注释在一起,可以将源输出为YAML,并且可以使用数据结构(在conf中可用)。使用。

mga*_*mba 3

您可以对所有插入进行字符串替换:

require 'yaml'

source = {
  :client => 'host4.example.com',
  :server => '192.168.222.222',
}.to_yaml

substitution_list = {
  /:client:/ => "# hostname or IP address of client\n:client:",
  /:server:/ => "# hostname or IP address of server\n:server:"
}

substitution_list.each do |pattern, replacement|
  source.gsub!(pattern, replacement)
end

puts source
Run Code Online (Sandbox Code Playgroud)

输出:

--- 
# hostname or IP address of client
:client: host4.example.com
# hostname or IP address of server
:server: 192.168.222.222
Run Code Online (Sandbox Code Playgroud)