簡體   English   中英

在Ruby中迭代哈希的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM