Я пытался программно создать вложенный хэш по умолчанию в Ruby, в основном это сокращение от Ruby:
h = Hash.new {|h,k| h[k] = Hash.new}
Я хотел бы расширить это для работы на столько уровней, сколько необходимо,Я сделал следующую функцию:
def nested_hash(level, default={})
return default if level == 0
return Hash.new{ |h,k| h[k] = nested_hash(level - 1, default) }
end
Похоже, что она работает правильно, но я сталкиваюсь со следующей проблемой при создании нескольких ключей
h = nested_hash(1)
h[0][1] = [1, 2, 3] # h is {0=>{1=>[1, 2, 3]}}
h[2] # should give a new Hash, but returns {1=>[1, 2, 3]}
h # {0=>{1=>[1, 2, 3]}, 2=>{1=>[1, 2, 3]}}
Почему для функции меняется значение по умолчаниюи становится ранее установленным значением?
РЕДАКТИРОВАТЬ
Я нашел решение, которое работает:
def nested_hash(level, default={})
return Hash.new{ |h,k| h[k] = default } if level <= 1
Hash.new{ |h,k| h[k] = nested_hash(level - 1, default) }
end
Неважно, это не 'я не могу работать аналогичным образом:
h = nested_hash(1)
h[0][1] = [1, 2, 3]
h[2][0] # nil
h # {0=>{1=>[1, 2, 3]}, 2=>{1=>[1, 2, 3]}}
Я все еще не понимаю, почему исходные значения по умолчанию были разделены между клавишами.