0

簡単な質問がありました。次のコードを検討してください。

class Hash
  def value_for(keys, value)
    common = self
    while keys.size > 1 and !common.nil?
      common = common[keys.shift] || { }
    end
    common[keys.last] = value
  end
end

このコードでは、ネストされたノードの配列と割り当てられる値を渡すことで、ネストされたハッシュを作成できることを願っています。

次のように動作するはずです。

hash = {
  "message" => "hello world"
}

hash.value_for [ "nested", "message" ], "hello world"

hash
#=> {
       "message" => "hello world",
       "nested" => {
         "message" => "hello world"
       }
    }

hash.value_for [ "second", "nested", "message" ], "hello world"

hash
#=> {
       "message" => "hello world",
       "nested" => {
         "message" => "hello world"
       },
       "second" => {
         "nested" => {
           "message" => "hello world"
         }
       }
    }

何らかの理由で、新しいハッシュを作成するときにコードが機能しません。何か関係があるのではないかと疑っているcommon = common[keys.shift] || { }

誰か助けてくれませんか?私は愚かな何かが欠けていると感じています....

どうもありがとう

4

2 に答える 2

1

次のように実行できます。

class Hash
  def value_for((*keys, last), value)
    _h = nil
    keys.inject(self){|h, k| _h = h[k] ||= {}}
    _h[last] = value
  end
end
于 2013-01-04T15:00:38.740 に答える
0

動作するコード サンプルを次に示します。

class Hash
  def value_for(keys, value)
    common = {}
    common[keys.last] = value
    (keys.size - 2).downto(0).each do |index|
      common[keys[index]] = {keys[index+1] => common[keys[index+1]]}
    end 
    return common
  end 
end

コードの問題は次のとおりです。

  1. key[i] は key[i+1] の値に依存するため、目的を達成するには、キーを逆の順序でトラバースする必要があります。
  2. キーごとに新しいハッシュを作成する必要がありますが、common[keys.shift]実際には値ですが、別のレベルのネストを追加する必要があります。

お役に立てれば。

于 2013-01-04T14:45:56.230 に答える