代码之家  ›  专栏  ›  技术社区  ›  Andy

在Ruby中是否可以像在PHP中那样自动初始化多维哈希数组?

  •  5
  • Andy  · 技术社区  · 14 年前

    我已经习惯在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中有没有类似的方法?或者我需要先初始化所有维度,然后再赋值。是否可以定义一个允许执行我需要的操作的高级哈希?你会怎么做?


    更新

    除了道格拉斯提出的解决方案(见下文),我发现 thread on the subject 其中,Brian Schr_ 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'] .


    一些附加参考资料

    1. ruby hash autovivification (facets)
    2. http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
    3. http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml
    1 回复  |  直到 14 年前
        1
  •  7
  •   Douglas    14 年前

    试试这个:

    def hash_with_default_hash
        Hash.new { |hash, key| hash[key] = hash_with_default_hash }
    end
    
    a = hash_with_default_hash
    

    如果键不存在,则块的结果将用作默认值。在这种情况下,默认值也是使用哈希作为默认值的哈希。