[英]Issues iterating over a hash in Ruby
我想做的是傳入一個類似於下面的散列哈希:
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的新手。
您可以在遞歸方法的多次調用之間傳遞字符串,並像累加器一樣使用它們。
此方法使用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
(這假設您希望輸出為格式化,如上所示)
這篇博文有一個很好的遞歸解決方案,並使用Ruby中提供的method_missing
方法提供了更好的替代方案。
一般來說,你的遞歸是正確的,你只是想做一些不同的事情而不是將輸出連接到out
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.