在Ruby中迭代哈希的问题

时间:2013-04-03 01:02:11

标签: ruby recursion hash

我想要做的是传递一个类似于此的散列哈希:

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 个答案:

答案 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