如何在ruby中将一个哈希与另一个哈希相结合

the*_*nso 40 ruby hashmap

我有两个哈希......

a = {:a => 5}
b = {:b => 10}
Run Code Online (Sandbox Code Playgroud)

我想要...

c = {:a => 5,:b => 10}
Run Code Online (Sandbox Code Playgroud)

如何创建哈希c?

tad*_*man 66

如果你只是交错,这是一个非常简单的操作:

c = a.merge(b)
Run Code Online (Sandbox Code Playgroud)

如果你想将这些值实际添加到一起,这将会有点棘手,但并非不可能:

c = a.dup
b.each do |k, v|
  c[k] ||= 0
  c[k] += v
end
Run Code Online (Sandbox Code Playgroud)

原因a.dup是为了避免破坏a散列中的值,但如果你不在乎你可以跳过那一部分.将||=用于确保它的默认启动0nil + 1无效.


Pra*_*thi 22

正如大家所说,你可以使用合并方法来解决你的问题.但是使用merge方法稍有问题.这就是原因.

person1 = {"name" => "MarkZuckerberg",  "company_name" => "Facebook", "job" => "CEO"}

person2 = {"name" => "BillGates",  "company_name" => "Microsoft", "position" => "Chairman"}
Run Code Online (Sandbox Code Playgroud)

看看这两个字段名称和company_name.这里的name和company_name在两个哈希中都是相同的(我的意思是键).下一个工作和位置有不同的键.

当你尝试合并两个哈希person1和person2如果person1和person2键是相同的?然后person2键值将覆盖peron1键值.这里第二个哈希将覆盖第一个哈希字段,因为它们都是相同的.这里的名称和公司名称相同.看到结果.

people  = person1.merge(person2)

 Output:  {"name"=>"BillGates", "company_name"=>"Microsoft", 
        "job"=>"CEO", "position"=>"Chairman"}
Run Code Online (Sandbox Code Playgroud)

但是,如果您不希望第二个哈希覆盖第一个哈希.你可以做这样的事情

  people  = person1.merge(person2) {|key, old, new| old}

  Output:   {"name"=>"MarkZuckerberg", "company_name"=>"Facebook", 
            "job"=>"CEO", "position"=>"Chairman"} 
Run Code Online (Sandbox Code Playgroud)

使用merge()时只是一个快速说明