gpt4 book ai didi

ruby - 如何用新值替换散列中的所有值?

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:23 26 4
gpt4 key购买 nike

假设我有一个任意深度的嵌套哈希 h :

h = {
:foo => { :bar => 1 },
:baz => 10,
:quux => { :swozz => {:muux => 1000}, :grimel => 200 }
# ...
}

假设我有一个类 C定义为:

class C
attr_accessor :dict
end

如何替换 h 中的所有嵌套值所以他们现在是C带有 dict 的实例属性设置为该值?例如,在上面的例子中,我希望有类似的东西:

h = {
:foo => <C @dict={:bar => 1}>,
:baz => 10,
:quux => <C @dict={:swozz => <C @dict={:muux => 1000}>, :grimel => 200}>
# ...
}

哪里<C @dict = ...>代表 C带有 @dict = ... 的实例. (请注意,一旦达到未嵌套的值,就停止将其包装在 C 实例中。)

最佳答案

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

如果我们重写 C 中的 inspect 以提供更友好的输出,如下所示:

def inspect
"<C @dict=#{dict.inspect}>"
end

然后运行您的示例 h 这将给出:

puts convert_hash(h).inspect

{:baz=>10, :quux=><C @dict={:grimel=>200,
:swozz=><C @dict={:muux=>1000}>}>, :foo=><C @dict={:bar=>1}>}

此外,如果您将 initialize 方法添加到 C 以设置 dict:

def initialize(d=nil)
self.dict = d
end

然后您可以将 convert_hash 中间的 3 行减少为 h[k] = C.new(convert_hash_h[k])

关于ruby - 如何用新值替换散列中的所有值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081429/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com