使用.update更新值

时间:2016-08-29 13:04:41

标签: ruby

如果我们有哈希并且我们想要更新其中一个值或键,我们可以轻松使用。update方法,如下所示

def foo(params)
    params+=1
end

hsh = {:a=>1,:b=>2,:c=>3}

hsh.update(hsh) do |key,oldVal|
    foo(oldVal)
end

p hsh

但是假设有一个新的hash,我想将其属性复制到另一个hash并将值加1。我怎么会这样做?这是我的尝试

def foo(params)
    params+=1
end
new_hsh = {:a=>1,:b=>2,:c=>3}
hsh = {}
hsh.update(new_hsh) do |key,value,newVal|
    newVal = foo(value)
end

p hsh

哪个输出{:a=>1,:b=>2,:c=>3}。因此它正在复制new_hsh,但不会更新value

根据文件

  

将other_hash的内容添加到hsh。如果未指定任何块,则使用来自other_hash的值覆盖具有重复键的条目,否则通过使用键调用块,将其值设置为hsh并将其值设置为other_hash来确定每个重复键的值。

所以它就像文档说的那样复制..但是我怎样才能更新呢?

由于

修改

尝试

def foo(params)
    params+=1
end
new_hsh = {:a=>1,:b=>2,:c=>3}
hsh = {}
hsh.update(new_hsh) do |key,value,newVal|
    foo(newVal)
end

p hsh

2 个答案:

答案 0 :(得分:1)

不要传递3个参数。就像这样传递2。迭代new_hsh的每个键值对,并在传递给foo方法并将其推入hsh后将键设置为等于新值。

def foo(params)
params+=1
end
new_hsh = {:a=>1,:b=>2,:c=>3}
hsh = {}
new_hsh.each do |key,value|
    hsh[key] = foo(value)
end

p hsh

答案 1 :(得分:1)

这是另一个答案。这可以工作,但也修改new_hsh。但是你需要在调用hsh上的update之前设置hsh = new_hsh。

def foo(params)
params+=1
end

new_hsh = {:a=>1,:b=>2,:c=>3}
hsh = new_hsh
hsh.update(hsh) do |key,value|
    hsh[key] = foo(value)
end

p hsh