0

我想做的是传入一个看起来像这样的哈希值:

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很陌生。

4

2 回答 2

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

(这假设您希望您的输出是如上所示格式化的字符串)

于 2013-04-03T01:30:55.027 回答
0

这篇博客文章method_missing为递归提供了一个不错的解决方案,并使用Ruby 中可用的方法提供了一个更好的替代方案。

一般来说,您的递归是正确的,您只想做一些不同的事情,而不是将输出连接到out.

于 2013-04-03T01:17:09.607 回答