有没有办法初始化哈希的所有子节点?

时间:2015-12-12 12:01:31

标签: ruby hash

只需多次初始化子元素即可。我的意思是:

@parent = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }

如果我尝试创建另一个多维节点,我尝试编码:

@parent[:child][some_field] = "Some example data..."

我总是收到这个错误:

undefined method `[]=' for nil:NilClass (NoMethodError)

你有什么想法如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

我需要更多的嵌套哈希,为什么不定义自己的类?

class NestedHash < Hash  
  def initialize
    super { |h,k| h[k] = Hash.new(&h.default_proc) }
  end
end

h = NestedHash.new
h[:foo][:bar] = :baz
h[:foo][:bar] #=> :baz

答案 1 :(得分:2)

与spickermann的答案有些相似,但有点不同。

class MyHash < Hash
  def initialize
    self.default_proc = proc{|h, k| h[k] = MyHash.new}
  end
end

@parent = MyHash.new

请注意,不需要将参数/块传递给MyHash.new,因为设置不同的默认值会使使用MyHash的目的失效,而Hash更适合这种情况