Как мне скопировать хеш в Ruby? - PullRequest
190 голосов
/ 11 ноября 2010

Я признаю, что я немного новичок в рубине (сейчас пишу сценарии рейка).На большинстве языков легко найти конструкторы копирования.Полчаса поиска не нашел его в рубине.Я хочу создать копию хэша, чтобы я мог изменить ее, не затрагивая исходный экземпляр.

Некоторые ожидаемые методы, которые не работают должным образом:

h0 = {  "John"=>"Adams","Thomas"=>"Jefferson","Johny"=>"Appleseed"}
h1=Hash.new(h0)
h2=h1.to_hash

Тем временем я прибег к этому неумелому обходному пути

def copyhash(inputhash)
  h = Hash.new
  inputhash.each do |pair|
    h.store(pair[0], pair[1])
  end
  return h
end

Ответы [ 13 ]

0 голосов
/ 26 июня 2013

Альтернативный способ Deep_Copy, который работал для меня.

h1 = {:a => 'foo'} 
h2 = Hash[h1.to_a]

Это привело к созданию deep_copy, поскольку h2 формируется с использованием представления массива h1, а не ссылок h1.

0 голосов
/ 09 февраля 2013

Поскольку в Ruby есть миллион способов сделать это, вот еще один способ использования Enumerable:

h0 = {  "John"=>"Adams","Thomas"=>"Jefferson","Johny"=>"Appleseed"}
h1 = h0.inject({}) do |new, (name, value)| 
    new[name] = value;
    new 
end
0 голосов
/ 17 ноября 2012

Это особый случай, но если вы начинаете с предопределенного хэша, который вы хотите получить и скопировать, вы можете создать метод, который возвращает хеш:

def johns 
    {  "John"=>"Adams","Thomas"=>"Jefferson","Johny"=>"Appleseed"}
end

h1 = johns

Конкретным сценарием, который у меня был, было то, что у меня была коллекция хэшей JSON-схемы, где одни хеши строились на основе других. Я изначально определял их как переменные класса и столкнулся с этой проблемой копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...