gpt4 book ai didi

ruby-on-rails - 如何在 Ruby 中合并和排序 YML 文件中的键?

转载 作者:太空宇宙 更新时间:2023-11-03 16:33:53 28 4
gpt4 key购买 nike

假设您有一个这样的 YML 文件:

en:
thanksgiving:
turkey: 'Turkey'
stuffing: 'Stuffing'
christmas:
ham: 'Bring ham'
thanksgiving:
beer: 'lots of beer'

并且您想使用 ruby​​ 基本上像这样读取、合并和重写 YML:

en:
thanksgiving:
turkey: 'Turkey'
stuffing: 'Stuffing'
beer: 'lots of beer'
christmas:
ham: 'Bring ham'

实现这一目标的最佳/最有效方法是什么?

最佳答案

您需要解析文件以获得节点表示:

yml = YAML.parse( open('c:\temp\foo.yml'))

yml 变量包含整个结构。示例:键入以下内容打印实际的整个文件内容

pp yml 

检查结果后,我能够编写一个安全的序列化程序。添加一个名为 config/initializers/yaml.rb

的文件
module YAML

def YAML.safe_load(file_name)
YAML::safe_load_node(YAML::parse(IO.read(file_name)))
end

def YAML.safe_load_node(input)
case input.kind
when :map
{}.tap do |h|
input.value.each do |key, node|
k,v = key.value, YAML::safe_load_node(node)
if (v.is_a?(Hash) and h[k].is_a?(Hash))
h[k] = h[k].merge(v)
elsif (v.is_a?(Array) and h[k].is_a?(Array))
h[k] = h[k] + v
else
h[k] = v
end
end
end
when :seq
input.value.map{|node| YAML::safe_load_node(node)}
when :scalar
input.value
end
end

end

现在在 Rails 控制台中:

>> y YAML::safe_load('c:/temp/test.yml')
---
en:
christmas:
ham: Bring ham
thanksgiving:
turkey: Turkey
stuffing: Stuffing
beer: lots of beer

关于ruby-on-rails - 如何在 Ruby 中合并和排序 YML 文件中的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942089/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com