Подтвердить что ты не робот

Как совместить один хэш с другим хешем в рубине

У меня есть два хэша...

a = {:a => 5}
b = {:b => 10}

Я хочу...

c = {:a => 5,:b => 10}

Как создать хэш c?

4b9b3361

Ответ 1

Это довольно простая операция, если вы просто чередуете:

c = a.merge(b)

Если вы хотите добавить значения вместе, это будет немного сложнее, но не невозможно:

c = a.dup
b.each do |k, v|
  c[k] ||= 0
  c[k] += v
end

Причина a.dup заключается в том, чтобы избежать искажения значений в хеше a, но если вам все равно, вы можете пропустить эту часть. ||= используется для обеспечения того, чтобы он начинался со значения по умолчанию 0, поскольку nil + 1 недействителен.

Ответ 2

Как все говорят, вы можете использовать метод слияния для решения вашей проблемы. Однако есть несколько проблем с использованием метода слияния. Вот почему.

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

person2 = {"name" => "BillGates",  "company_name" => "Microsoft", "position" => "Chairman"}

Взгляните на эти два имени полей и имя_компании. Здесь имя и имя_компании одинаковы в двух хэшах (я имею в виду клавиши). Следующее задание и позиция имеют разные клавиши.

Когда вы пытаетесь объединить два хэша person1 и person2 Если клавиши person1 и person2 одинаковы? то значение ключа person2 переопределит значение ключа peron1. Здесь второй хеш будет переопределять первые хеш-поля, потому что оба они одинаковы. Здесь имя и название компании одинаковы. См. Результат.

people  = person1.merge(person2)

 Output:  {"name"=>"BillGates", "company_name"=>"Microsoft", 
        "job"=>"CEO", "position"=>"Chairman"}

Однако, если вы не хотите, чтобы ваш второй хэш перекрывал первый хеш. Вы можете сделать что-то вроде этого

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

  Output:   {"name"=>"MarkZuckerberg", "company_name"=>"Facebook", 
            "job"=>"CEO", "position"=>"Chairman"} 

Это просто краткая заметка при использовании merge()

Ответ 4

Использовать метод слияния:

c = a.merge b