问题描述
假设我有一个任意嵌套的Hash code $:def初始化(d =零)
self.dict = d
结束
然后你可以减少 convert_hash
Let's say I have an arbitrarily deep nested Hash h:
h = { :foo => { :bar => 1 }, :baz => 10, :quux => { :swozz => {:muux => 1000}, :grimel => 200 } # ... }
And let's say I have a class C defined as:
class C attr_accessor :dict end
How do I replace all nested values in h so that they are now C instances with the dict attribute set to that value? For instance, in the above example, I'd expect to have something like:
h = { :foo => <C @dict={:bar => 1}>, :baz => 10, :quux => <C @dict={:swozz => <C @dict={:muux => 1000}>, :grimel => 200}> # ... }
where <C @dict = ...> represents a C instance with @dict = .... (Note that as soon as you reach a value which isn't nested, you stop wrapping it in C instances.)
def convert_hash(h) h.keys.each do |k| if h[k].is_a? Hash c = C.new c.dict = convert_hash(h[k]) h[k] = c end end h end
If we override inspect in C to give a more friendly output like so:
def inspect "<C @dict=#{dict.inspect}>" end
and then run with your example h this gives:
puts convert_hash(h).inspect {:baz=>10, :quux=><C @dict={:grimel=>200, :swozz=><C @dict={:muux=>1000}>}>, :foo=><C @dict={:bar=>1}>}
Also, if you add an initialize method to C for setting dict:
def initialize(d=nil) self.dict = d end
then you can reduce the 3 lines in the middle of convert_hash to just h[k] = C.new(convert_hash_h[k])
这篇关于如何用新值替换散列中的所有值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!