gpt4 book ai didi

php - 如何更新该散列循环内的 Ruby 散列项?

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:14 29 4
gpt4 key购买 nike

我正在将我的 PHP 代码迁移到 Ruby,有时我需要更新循环内的哈希元素。例如:

compositions.each_pair do |element,params|
params['composition'].each_pair do |item,data|
data['af'] /= params['af sum']
data['mf'] /= params['mass']
end
end

我可以使用项目索引来制作它,但它会很难看。有没有一种很好的方法可以将循环变量链接到相应的哈希项?在 PHP 中,我会在相应的循环中编写 &$params&$data。或者可能有更好的建议?


更新

两个测试来证明问题。第一个:

a={'a'=>1, 'b'=>2, 'c'=>3}

a.each_pair do |k,v|
v += 1
end
p a # => {"a"=>1, "b"=>2, "c"=>3}

第二个

a.each_pair do |k,v|
a[k] += 1
end
p a # => {"a"=>2, "b"=>3, "c"=>4}

更新2

感谢 Mladen(见下文),我了解了这两种情况之间的区别。但是,我还有一个问题:如何更新data 项(不仅仅是它自己的项)?假设我们添加

data = data['af'] + data['mf']

到内部循环。

最佳答案

问题中的代码似乎可以正常工作:

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:

我认为您无法理解示例中的 kv 是什么。它们只是 block 中的局部变量,它们首先引用散列中的任何内容,但它们引用的内容可以在 block 过程中像任何其他变量一样更改。该更改不会反射(reflect)到哈希中。您需要更改对象本身,而不是对它的引用,才能真正更改它。

看看这个更简单的例子,没有散列, block 乱七八糟:

a = 5
b = a
b += 1
a # => 5
b # => 6

就这么简单。

关于php - 如何更新该散列循环内的 Ruby 散列项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3150460/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com