本文介绍了在Ruby中可以自动初始化多维哈希数组,就像在PHP中一样?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 我很习惯在PHP中使用多维数组工作,在这里我可以分配和初始化一个哈希值。未设置($ A); //只是为了表明没有变量$ a 
$ a ['settings'] ['system'] ['memory'] ='1 Gb';
$ a ['settings'] ['system'] ['disk space'] ='100 Gb';

有没有办法在Ruby中做类似的事情?或者我需要首先初始化所有维度,然后分配值。是否有可能定义一个高级哈希来实现我需要的功能?你会怎么做?






更新



除Douglas提出的解决方案(见下文)外,我还找到了,其中BrianSchröäer提出了对 Hash 类的扩展:

  class AutoHash<哈希
def初始化(* args)
super()
@update,@update_index = args [0] [:update],args [0] [:update_key]除非args.empty?
结束

def [](k)
如果self.has_key?k
super(k)
else
AutoHash.new :update => self,:update_key => k)
end
end

def [] =(k,v)
@update [@update_index ] = self如果@update和@update_index
super
end
end

它允许解决问题,当只需要项目值时创建缺失的哈希项目,例如 a ['key']






其他参考




  1. 试试看
  2. 试试看这:

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

    a = hash_with_default_hash

    如果该键不存在,则块的结果将被用作默认值。在这种情况下,默认值也是使用散列作为其默认值的散列。


    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?


    Update

    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 Hash class:

    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
    

    It allows to solve the problem when a missing hash item is undesirably created when the item value was only requested, e.g. a['key'].


    Some additional references

    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
    解决方案

    Try this:

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

    If the key doesn't exist, then the result of the block will be used as the default value. In this case, the default value is also a hash which uses hashes as its default values.

    这篇关于在Ruby中可以自动初始化多维哈希数组,就像在PHP中一样?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 19:07