Ruby 有没有办法初始化散列的所有子节点?

Ruby 有没有办法初始化散列的所有子节点?,ruby,hash,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) 你知道如何解决这个问题吗?如果你需

总是要初始化子元素是多余的。我的意思是:

@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)

你知道如何解决这个问题吗?

如果你需要更多的嵌套哈希,为什么不定义自己的类呢

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
类嵌套哈希:baz

如果您经常需要嵌套哈希,为什么不定义自己的类呢

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
类嵌套哈希:baz

与斯皮克曼的答案有些相似,但有点不同

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

@parent = MyHash.new
class MyHash

请注意,无需将参数/块传递给
MyHash。新的
设置不同的默认值会破坏使用
MyHash
的目的,而
Hash
更适合这种情况。

与spickermann的答案有点类似,但有点不同

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

@parent = MyHash.new
class MyHash

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

这对我来说很有效:
parent=Hash.new{h,k{h[k]=Hash.new(&h.default_-proc)};父项[:子项][:某些字段]=4
。你能给我们更精确的步骤来重现这个问题吗?你有什么默认版本?你使用什么Ruby版本?散列的构造函数是正确的,我怀疑的是类似于
@parent[:child]=nil的事情发生在代码中的某个地方我认为你是对的。配置是正确的,经过一点测试,我找到了罪魁祸首。事实证明,上面的@parent示例没有使用Hash.new{h,k{h[k]=Hash.new(&h.default_proc)},而是使用来自simple_xlsx_reader的对象。我正在构建的应用程序是一个生成器,如果没有找到任何参数,将使用上面给出的示例;父项[:子项][:某些字段]=4
。你能给我们更精确的步骤来重现这个问题吗?你有什么默认版本?你使用什么Ruby版本?散列的构造函数是正确的,我怀疑的是类似于
@parent[:child]=nil的事情发生在代码中的某个地方我认为你是对的。配置是正确的,经过一点测试,我找到了罪魁祸首。事实证明,上面的@parent示例没有使用Hash.new{h,k{h[k]=Hash.new(&h.default_proc)},而是使用来自simple_xlsx_reader的对象。我正在构建的应用程序是一个生成器,如果没有找到参数,将使用上面给出的示例。