【问题标题】:How to update a value under nested mapped yml如何更新嵌套映射 yml 下的值
【发布时间】:2015-03-05 08:08:26
【问题描述】:

我有一个像下面这样的 yml。

ss_usecase_1:
  -    
       key1: "val1" 
       key2: "val2" 
       key3: "45x" 
       key4: 11.26.44.23
       key5: "admin" 
       key6: "CUP" 
       key7: 960

ss_usecase_2:
  -    
       key1: "val3" 
       key2: "val4" 
       key3: "aby45" 
       key4: 11.25.4.26
       key5: "admin" 
       key6: "CUP" 
       key7: 962

我想更新 ss_usecase_2 下的 key6。以下是我尝试更新 yml 的方式,但它完全破坏了我的 yml。在这个过程中,主密钥的“ss_usecase_1”和“ss_usecase_2”都没有了

dump_data=YAML::load(File.open("path to yml"))
data=dump_data['ss_usecase_1'][0]

data['key6']="cup1"
File.open("data/synched_services/usecase_1.yml", 'w') { |f| YAML.dump(data, f) }

有没有什么有效的方法可以做到这一点而不会干扰我的任何 yml 数据?

【问题讨论】:

  • 你做了same,不知道为什么你的没有工作。

标签: ruby-on-rails ruby


【解决方案1】:

如果您不想 dump_data 被操纵,请使用 clone

data = dump_data['ss_usecase_1'][0].clone

(clone) 产生 obj 的浅拷贝——obj 的实例变量是 复制,但不是它们引用的对象。克隆复制冻结 和 obj 的污染状态。

举例说明:

dump_data['ss_usecase_1'][0]
# => {"key1"=>"val1", "key2"=>"val2", "key3"=>"45x", "key4"=>"11.26.44.23", "key5"=>"admin", "key6"=>"cup1", "key7"=>960}

data = dump_data['ss_usecase_1'][0]
data["key1"] = "abc"
dump_data['ss_usecase_1'][0]
# => {"key1"=>"abc", "key2"=>"val2", "key3"=>"45x", "key4"=>"11.26.44.23", "key5"=>"admin", "key6"=>"cup1", "key7"=>960} 
#notice key1 is getting changed for dump_data too

使用clone的相同示例:

data = dump_data['ss_usecase_1'][0].clone
data["key1"] = "abc"
dump_data['ss_usecase_1'][0]
# => {"key1"=>"val1", "key2"=>"val2", "key3"=>"45x", "key4"=>"11.26.44.23", "key5"=>"admin", "key6"=>"cup1", "key7"=>960} 
#notice key1 is unchanged

【讨论】:

    【解决方案2】:

    下面是工作示例:

    require 'yaml'
    
    data = YAML::load(File.open('1.yml')) # loading 1.yml into data variable
    data['ss_usecase_2'][0]['key6'] = 'cup1' # changing key6 under ss_usecase_2
    File.open('2.yml', 'w') { |file| file.write(data.to_yaml) } # saving to 2.yml
    

    如果您想覆盖现有文件,只需在两个File.open 说明中指定即可。

    【讨论】:

      猜你喜欢
      • 2018-05-15
      • 1970-01-01
      • 2021-06-25
      • 2017-09-11
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多