Этот вопрос уже имеет ответы здесь :
Закрытый 5 месяцев назад .
Я так используюсь для работы в PHP с многомерными массивами, где я могу присвоить и инициализировать хеш
unset($a); // just to show that there is no variable $a
$a['settings']['system']['memory'] = '1 Gb';
$a['settings']['system']['disk space'] = '100 Gb';
Существует ли способ сделать подобную вещь в Ruby? Или я должен инициализировать все размеры сначала, и затем присваивать значения. Действительно ли возможно определить усовершенствованный Хеш, который позволит делать то, в чем я нуждаюсь? Как Вы сделали бы это?
Обновление
В дополнение к решению, предложенному Douglas (см. ниже), я нашел поток на предмете , в котором Brian Schröäer предложил расширение для Hash
класс:
class AutoHash < Hash
def initialize(*args)
super()
@update, @update_index = args[0][:update], args[0][:update_key] unless args.empty?
end
def [](k)
if self.has_key?k
super(k)
else
AutoHash.new(:update => self, :update_key => k)
end
end
def []=(k, v)
@update[@update_index] = self if @update and @update_index
super
end
end
Это позволяет решать проблему, когда недостающий объект хеша нежелательно создается, когда значение объекта только требовали, например. a['key']
.
Некоторые дополнительные ссылки
рубиновый хеш autovivification (фасеты)
http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml