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的对象。我正在构建的应用程序是一个生成器,如果没有找到参数,将使用上面给出的示例。