I am so used to work in PHP with multi-dimensional arrays, where I can assign and initialize a hash by
unset($a); // just to show that there is no variable $a $a['settings']['system']['memory'] = '1 Gb'; $a['settings']['system']['disk space'] = '100 Gb';
Is there a way to do similar thing in Ruby? Or I need to initialize all dimensions first, and then to assign values. Is it possible to define an advanced Hash which will allow to do what I need? How would you do that?
In addition to the solution proposed by Douglas (see below), I have found a thread on the subject, in which Brian Schröäer has proposed an extension for the
class AutoHash < Hash def initialize(*args) super() @update, @update_index = args[:update], args[: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
It allows to solve the problem when a missing hash item is undesirably created when the item value was only requested, e.g.
Some additional references
- ruby hash autovivification (facets)