У меня есть такой хэш:
entity = {1=> nil, 2 => {3 => nil, 4 => 1}}
Я написал функцию, которая может удалять нулевые значения данного объекта с помощью рекурсии.
def clear_null_values(entity)
entity.each do |key, value|
if value == nil || value.blank?
entity.delete(key)
elsif value.is_a? Hash
clear_null_values(value)
entity.delete(key) if value.blank?
end
end
end
А также мне нужна оригинальная сущность для других целей. Поэтому я продублировал хеш-переменную, а затем очистил нулевые значения.
final_entity = entity.dup
clear_null_values(entity)
puts entity
puts final_entity
Результат:
{2 => {4 => 1}}
{1=> nil, 2 => {4 => 1}} # the nested values are overwritten.
В идеале final_entity должен совпадать с исходной сущностью.
Вопрос1: Почему entity.dup
копирует только внешний хеш?
Вопрос2: Как сделать final_entity точной копией оригинальной сущности, т.е. даже если мы изменим сущность, то также не изменится final_entity?