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 に答える