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,3]}}h[2] # should give a new Hash,but returns {1=>[1,3]}h # {0=>{1=>[1,3]},2=>{1=>[1,3]}}
为什么函数的默认值会更改并成为先前设置的值?
编辑
我找到了一个有效的解决方案:
def nested_hash(level,default={}) return Hash.new{ |h,k| h[k] = default } if level <= 1 Hash.new{ |h,default) }end
没关系,这不会以类似的方式工作:
h = nested_hash(1)h[0][1] = [1,3]h[2][0] # nilh # {0=>{1=>[1,3]}}
我仍然对为什么原始默认值在密钥之间共享感到困惑.
解决方法 只是出于好奇:hash = Hash.new do |h,k| h[k] = h.dup.clear.extend(Module.new do define_method(:level,->{ h.level - 1 }) end).tap { |this| raise " 总结以上是内存溢出为你收集整理的ruby-on-rails – 在Ruby中通过递归嵌套哈希全部内容,希望文章能够帮你解决ruby-on-rails – 在Ruby中通过递归嵌套哈希所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)