问题中的代码似乎工作正常:
compositions = {1 => {'af sum' => 100.0, 'mass' => 200.0, 'composition' => {1 => {'af' => 5.0, 'mf' => 6.0}, 2 => {'af' => 7.0, 'mf' => 8.0}, 3 => {'af' => 9.0, 'mf' => 16.0}}}}
#=> {1=>{"af sum"=>100.0, "mass"=>200.0, "composition"=>{1=>{"af"=>5.0, "mf"=>6.0}, 2=>{"af"=>7.0, "mf"=>8.0}, 3=>{"af"=>9.0, "mf"=>16.0}}}}
compositions.each_pair do |element,params|
params['composition'].each_pair do |item,data|
data['af'] /= params['af sum']
data['mf'] /= params['mass']
end
end
#=> {1=>{"af sum"=>100.0, "mass"=>200.0, "composition"=>{1=>{"af"=>0.05, "mf"=>0.03}, 2=>{"af"=>0.07, "mf"=>0.04}, 3=>{"af"=>0.09, "mf"=>0.08}}}}
但是示例结构是从代码中猜出来的,OP应该发布一个他正在使用的示例,这样我们就可以实际取得一些进展。
编辑:
当你表演的时候
+
方法返回一个新对象作为结果。该对象被分配给
v
在第一个示例中,但没有分配回散列,因此不保留散列。在第二个示例中,将其分配回散列。
但是,如果您使用的是可变方法,那么您可以在适当的位置更改这些对象,这样就不需要将它们重新分配给散列。例如:
{1 => 'foo', 2 => 'bar'}.each{|k,v| v.swapcase!}
#=> {1=>"FOO", 2=>"BAR"}
但是
{1 => 'foo', 2 => 'bar'}.each{|k,v| v = 'baz'}
#=> {1=>"foo", 2=>"bar"}
编辑2:
我想你很难理解
k
和
V
在这些例子中是。它们只是块中的局部变量,从引用哈希中的任何内容开始,但是它们引用的内容可以在块的过程中更改,就像使用任何其他变量一样。这种变化不会反映到散列值上。你需要改变
非常对象
不是对它的引用,而是对它的实际更改。
看看这个,甚至更简单的例子,没有哈希,blocks-mumbo-jumbo:
a = 5
b = a
b += 1
a # => 5
b # => 6
就这么简单。