Я так привык работать в 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?Или мне нужно сначала инициализировать все измерения, а затем назначить значения.Можно ли определить расширенный хэш, который позволит делать то, что мне нужно?Как бы вы это сделали?
Обновление
Помимо решения, предложенного Дугласом (см. Ниже), я обнаружил нить насубъект , в котором Брайан Шреаер предложил расширение для класса 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']
.
Некоторые дополнительные ссылки
- Автовификация рубинового хэша (фасеты)
- http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
- http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml