2013-04-03 107 views
0

哈希我想什麼做的是通過在哈希散列看起來是這樣的:問題迭代在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很新。

回答

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 

(這是假設你希望你的輸出是一個字符串格式化爲你如上圖所示)

0

blog post有一個體面的遞歸解決方案,並提供了一個使用Ruby中可用的method_missing方法稍微更好的選擇。

一般來說,你的遞歸是正確的,你只是想做一些不同的事情,而不是連接輸出到out

+1

'method_missing'通常很方便,但往往不是「更好」。它涉及許多相對模糊的控制流程,從性能角度來看,分發非常昂貴。 – dbenhur

+0

性能打擊非常真實,但我想提一提,因爲它可以爲某些問題提供簡單/有點優雅的解決方案。 –