如何以递归方式在ruby哈希中用""替换所有nil值?

ohh*_*hho 14 ruby hash proc

str = "<a><b><c></c></b></a>"
hash = Hash.from_xml(str)
# => {"a"=>{"b"=>{"c"=>nil}}}
Run Code Online (Sandbox Code Playgroud)

如何替换nil哈希中的所有s以""使哈希变为:

{"a"=>{"b"=>{"c"=>""}}}
Run Code Online (Sandbox Code Playgroud)

Car*_*and 13

这是一个不会更改原始哈希的递归方法.

def denilize(h)
  h.each_with_object({}) { |(k,v),g|
    g[k] = (Hash === v) ?  denilize(v) : v.nil? ? '' : v }
end
Run Code Online (Sandbox Code Playgroud)

例子

h = { "a"=>{ "b"=>{ "c"=>nil } } }
denilize(h) #=> { "a"=>{ "b"=>{ "c"=>"" } } }

h = { "a"=>{ "b"=>{ "c"=>nil , "d"=>3, "e"=>nil}, "f"=>nil  } }
denilize(h) #=> { "a"=>{ "b"=>{ "c"=>"" , "d"=>3, "e"=>""}, "f"=>"" } } 
Run Code Online (Sandbox Code Playgroud)