我一直在尝试以编程方式创建Ruby中的嵌套默认哈希表,基本上是Ruby中冒号的简写:
为什么函数的默认值会改变并变为先前设置的值?
编辑
我已经找到了一个可行的解决方案:
不要紧,这种方法也无法解决类似的问题:
h = Hash.new {|h,k| h[k] = Hash.new}
我希望把这个功能扩展到尽可能多的层级。我写了下面这个函数:
def nested_hash(level, default={})
return default if level == 0
return Hash.new{ |h,k| h[k] = nested_hash(level - 1, default) }
end
看起来它正常工作,但是当我创建多个密钥时,遇到了以下问题
h = nested_hash(1)
h[0][1] = [1, 2, 3] # h is {0=>{1=>[1, 2, 3]}}
h[2] # should give a new Hash, but returns {1=>[1, 2, 3]}
h # {0=>{1=>[1, 2, 3]}, 2=>{1=>[1, 2, 3]}}
为什么函数的默认值会改变并变为先前设置的值?
编辑
我已经找到了一个可行的解决方案:
def nested_hash(level, default={})
return Hash.new{ |h,k| h[k] = default } if level <= 1
Hash.new{ |h,k| h[k] = nested_hash(level - 1, default) }
end
不要紧,这种方法也无法解决类似的问题:
h = nested_hash(1)
h[0][1] = [1, 2, 3]
h[2][0] # nil
h # {0=>{1=>[1, 2, 3]}, 2=>{1=>[1, 2, 3]}}
我仍然不明白为什么原始默认值要在键之间共享。
h.dup.clear
而不是一个新的空哈希? - Mulan:level
方法?非常有趣的方法 :D - Mulanh = nhash(2, [])
这样的东西,之后我可以执行h[0][1] << 1
。或者甚至像h = nhash(2, 0)
这样的东西,之后我可以执行h[0][1] += 1
。 - Abundance