【问题标题】:How to merge two the same objects in Ruby [duplicate]如何在Ruby中合并两个相同的对象[重复]
【发布时间】:2018-05-18 13:36:38
【问题描述】:

我有两个看起来像这样的对象:

obj1 = { hostname: "test",
         cpu: 20, 
         disk_space: nil,
         ram: nil,
         check_time: "2017-12-05 01:28" }

obj2 = { hostname: "test",
         cpu: nil,
         disk_space: 3000,
         ram: nil, 
         check_time: "2017-12-05 01:28"}

我想用来自obj2disk_space: 3000 覆盖disk_space: nil。我想基本上覆盖nils

new_obj = { hostname: "test",
            cpu: 20,
            disk_space: 3000,
            ram: nil,
            check_time: "2017-12-05 01:28" }

如何在 Ruby 中实现这一点?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    merge?

    obj1.merge(obj2) { |key, oldval, newval| oldval.nil? ? newval : oldval }
    => {:hostname=>"test", :cpu=>20, :disk_space=>3000, :ram=>nil, :check_time=>"2017-12-05 01:28"}
    

    简而言之:

    obj1.merge(obj2) { |_, v, w| v.nil? ? w : v }
    

    【讨论】:

    • 你是个天才 :D 谢谢!
    • 我们也可以使用oldval ||= newval
    • @Sagar,如果oldval 可能是false,则不是。
    【解决方案2】:

    我更喜欢@StefanPochman 的回答,但既然采用了这种方法,那就另当别论了。

    obj1.merge obj2.select { |k,_| obj1[k].nil? }
      #=> {:hostname=>"test", :cpu=>20, :disk_space=>3000, :ram=>nil,
      #    :check_time=>"2017-12-05 01:28"}
    

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多