我想要做的是传递一个类似于此的散列哈希:
input = {
"configVersion" => "someVers",
"box" =>
{
"primary" => {
"ip" => "192.168.1.1",
"host" => "something"
},
"api" => {
"live" => "livekey",
"test" => "testkey"
}
}
}
然后迭代它,继续,如果该值是另一个哈希,并使用它生成输出。结果应该是这样的:
configVersion = "someVers"
box.primary.ip = "192.168.1.1"
box.primary.host = "something"
依旧......
我知道如何抓取并继续,如果值是一个哈希值,但我不确定如何将整个事物连接起来并将值重新传递回来。这是我的代码:
def crawl(input)
input.each do |k,v|
case v
when Hash
out < "#{k}."
crawl(v)
else
out < " = '#{v}';"
end
end
end
我的问题是:在哪里定义out
以及如何将其全部归还。我是Ruby的新手。
答案 0 :(得分:2)
您可以在递归方法的多次调用之间传递字符串,并像累加器一样使用它们。
此方法使用ancestors
字符串构建点符号字符串,并使用输出str
收集输出并在方法结束时返回它。每次通话都会传递str
; chain
变量是ancestor
字符串的修改版本,该字符串随着调用而变化:
def hash_to_string(hash, ancestors = "", str = "")
hash.each do |key, value|
chain = ancestors.empty? ? key : "#{ancestors}.#{key}"
if value.is_a? Hash
hash_to_string(value, chain, str)
else
str << "#{chain} = \"#{value}\"\n"
end
end
str
end
hash_to_string input
(这假设你希望你的输出是一个如上所示格式化的字符串)
答案 1 :(得分:0)
这个blog post有一个很好的递归解决方案,并使用Ruby中提供的method_missing
方法提供了更好的替代方案。
一般来说,你的递归是正确的,你只想做一些不同的事情而不是将输出连接到out
。