在if块中更改和编辑Hash的键

时间:2014-10-02 17:06:22

标签: ruby-on-rails ruby if-statement hash

Hello需要更改if块内的哈希键,并在每个循环中为每个键附加一些值,但是它确实有效,但每次运行都会继续更改,并返回不同的结果。

假设哈希被称为哈希,我正在检查它内部是否有任何哈希值而不是更改其键值

我有这个

    ...

    hash.each {|key,value|
        if hash[key].is_a?(Hash)
           hash[:"Match #{key}"] = hash[key]
           hash.delete(key)
           ....
           puts hash.keys
        end
 }

  ...

使用此代码段时,第一次运行返回良好,但后续运行会混淆并重复大量值,每次都会给出不同的结果。

就像跑步1一样

       Match User gideon

假设我在提供的哈希中有一个用户gideon密钥哈希,这是正确的,但它是非常不可预测的

第二轮

             Match User gideon          
             Match Match User gideon
             Match Match Match User gideon
             Match Match Match Match User gideon
             Match Match Match Match Match User gideon
             Match Match Match Match Match Match User gideon

所以摧毁一切 帮助赞赏

2 个答案:

答案 0 :(得分:2)

您的代码无法运行。 Ruby说" RuntimeError: can't add a new key into hash during iteration"。

我建议你做一个新的哈希。

new_hash = {}
hash.each do |key,value|
  if value.is_a?(Hash)
    new_hash[:"Match #{key}"] = value
  else
    new_hash[key] = value
  end

puts new_hash.keys
end

答案 1 :(得分:2)

假设:

h = { :bacon=>"good", 3=>{:waffles=>"yum"}, :stack=>{"pancakes"=>"OK"} }

我假设您要将其转换为:

h = { :bacon=>"good", :"Match 3"=>{:waffles=>"yum"},
      :"Match stack"=>{"pancakes"=>"OK"} }

这是你可以做到的一种方式:

h.keys.each { |k| (h[:"Match #{k}"] = h.delete(k)) if h[k].is_a? Hash }
h

这个例子的灵感来自@muistooshort(a.k.a.μ)的作品。