【问题标题】:Preserve key order loading YAML from a file in Ruby保留从 Ruby 文件中加载 YAML 的键顺序
【发布时间】:2011-05-10 21:06:13
【问题描述】:

我想保留从磁盘加载、以某种方式处理并写回磁盘的 YAML 文件中键的顺序。

这是在 Ruby (v1.8.7) 中加载 YAML 的基本示例:

require 'yaml'

configuration = nil
File.open('configuration.yaml', 'r') do |file|
  configuration = YAML::load(file)
  # at this point configuration is a hash with keys in an undefined order
end

# process configuration in some way

File.open('output.yaml', 'w+') do |file|
  YAML::dump(configuration, file)
end

不幸的是,一旦构建了哈希,这将破坏configuration.yaml 中键的顺序。我找不到控制YAML::load() 使用什么数据结构的方法,例如alib 的orderedmap

我没有运气在网上搜索解决方案。

【问题讨论】:

  • 你使用的是什么版本的 ruby​​?
  • 那么,你无法做到这一点。 ruby 1.8 中的哈希没有排序的概念。
  • @sawa:在 Ruby 1.8 中没有一个可以进行有序哈希的 gem 吗? (我不记得它是猴子补丁哈希还是创建自己的类)
  • @Andrew 我找到了 OrderedHash:rubygems.org/gems/orderedhash。我看起来像是创建了一个 Hash 的子类,将订单信息保存为一个实例变量数组。

标签: ruby load key yaml


【解决方案1】:

使用 Ruby 1.9.x。之前的 Ruby 版本不保留 Hash 键的顺序,但 1.9 可以。

【讨论】:

  • 当时我被 1.8.7 困住了。
【解决方案2】:

如果您因任何原因(就像我一样)无法使用 1.8.7,我会使用 active_support/ordered_hash。我知道activesupport 似乎是一个很大的包含,但他们在以后的版本中对其进行了重构,您几乎只需要文件中需要的部分,其余部分被遗漏了。只需gem install activesupport,并如下所示包含它。此外,在您的 YAML 文件中,请务必使用 !!omap 声明(和哈希数组)。示例时间!

# config.yml #

months: !!omap
  - january: enero
  - february: febrero
  - march: marzo
  - april: abril
  - may: mayo

这是它背后的 Ruby 的样子。

# loader.rb #

require 'yaml'
require 'active_support/ordered_hash'

# Load up the file into a Hash
config = File.open('config.yml','r') { |f| YAML::load f }

# So long as you specified an !!omap, this is actually a
# YAML::PrivateClass, an array of Hashes
puts config['months'].class

# Parse through its value attribute, stick results in an OrderedHash,
# and reassign it to our hash
ordered = ActiveSupport::OrderedHash.new
config['months'].value.each { |m| ordered[m.keys.first] = m.values.first }
config['months'] = ordered

我正在寻找一种解决方案,它允许我递归地挖掘从.yml 文件加载的Hash,查找那些YAML::PrivateClass 对象,并将它们转换为ActiveSupport::OrderedHash。我可能会就此发表一个问题。

【讨论】:

    【解决方案3】:

    有人想出了the same issue。有一颗宝石ordered hash。请注意,它不是哈希,它创建哈希的子类。您可以尝试一下,但如果您发现处理 YAML 时出现问题,那么您应该考虑升级到 ruby​​1.9。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-05
      • 2018-08-01
      • 2017-01-14
      • 2020-10-22
      • 2016-02-11
      • 2015-10-14
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多