【问题标题】:Update value in repeated node for YAML file (Ruby)?更新 YAML 文件(Ruby)的重复节点中的值?
【发布时间】:2015-05-28 04:55:28
【问题描述】:

是否有用于更新 YAML 重复节点中给定属性的值的内置机制?我承认枚举是一种解决方案,但想知道是否有更好的方法。

例子:

require 'yaml'

yml = <<-eos
  common: &default_settings
    prop: 'xyz'

  something:
    <<: *default_settings
eos


config = YAML.load(yml)
config['common']['prop'] = "zzz"

p config
# I'm surprised the output is
# {"common"=>{"prop"=>"zzz"}, "something"=>{"prop"=>"xyz"}}
#
# I was expecting
# {"common"=>{"prop"=>"zzz"}, "something"=>{"prop"=>"zzz"}}

【问题讨论】:

  • 为什么会出人意料?在加载YAML 后,您正在修改Hash。这根本不会修改YAML 文件。一旦你load 它只是一个Hash 并且会像Hash 一样执行
  • 好的。我了解@engineersmnky。我想我最初的问题应该是is there a way to update a value for a given property in a YAML repeated node prior to loading the file?

标签: ruby yaml


【解决方案1】:

如果您检查object_id,您可以看到"common""something" 有2 个完全不同的Hash 对象。这就是为什么改变一个对象,键的值不会影响另一个对象。

require 'yaml'

yml = <<-eos
  common: &default_settings
    prop: 'xyz'

  something:
    <<: *default_settings
eos

config = YAML.load yml
config  # => {"common"=>{"prop"=>"xyz"}, "something"=>{"prop"=>"xyz"}}
config['common'].object_id # => 73499930
config['something'].object_id # => 73499700

由于上述事实,当你这样做config['common']['prop'] = "zzz"时,它只修改了{"prop"=&gt;"xyz"}的哈希值,即"prop"的值,而不是"something"

【讨论】:

    【解决方案2】:

    我找到了解决问题的方法:

    require 'yaml'
    
    yml = <<-eos
      common: &default_settings
        prop: 'xyz'
    
      something:
        <<: *default_settings
    eos
    
    
    parsed = YAML.parse(yml) # => #<Psych::Nodes::Document>
    
    parsed.each do |n|
      if n.respond_to?('anchor') && n.anchor == "default_settings"
        n.children.each do |n|
          if n.style == 2
            n.value = 'zzz'
          end
        end if n.children
      end
    end
    
    
    p parsed.to_ruby
    #{"common"=>{"prop"=>"zzz"}, "something"=>{"prop"=>"zzz"}}
    

    再次感谢您的回复。如果有人有其他想法或想法,总是乐于学习更好的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-10
      • 2012-12-06
      • 2011-12-13
      • 2020-11-06
      • 2023-02-11
      • 2013-02-02
      • 2012-11-10
      • 2012-10-27
      相关资源
      最近更新 更多