Ruby中Hash赋值数组后原数组修改导致对应值同步变更问题求助
代码问题核心原因
- 数组为引用类型:Ruby 中数组属于引用对象,你代码中每个外层循环周期内只有一个
@sumArray实例,执行@possibleSums[tmpSum] = @sumArray时,哈希存储的是该数组的内存引用,而非当前数组内容的副本。后续你对@sumArray执行push操作修改的是同一个对象,因此哈希中所有指向该对象的键对应值都会同步更新。 - 赋值时未做数组拷贝:你没有把当前状态的数组内容独立存储,所有哈希值最终都指向同一个不断变化的数组实例,才会出现旧值跟着同步修改的异常。
修复方法
仅需要修改赋值行,存储当前数组的副本即可,调用数组的dup方法复制当前状态的新数组存入哈希:
testArray=[1,2,3,4] @possibleSums=Hash.new {|h,k| h[k] = [] } for j in 0..testArray.size-1 tmpSum=0 output="" @sumArray=[] for k in j..testArray.size-1 tmpSum=tmpSum+testArray[k] output=output+"+"+testArray[k].to_s @sumArray.push(testArray[k]) # 此处改为存数组的副本 @possibleSums[tmpSum] = @sumArray.dup p output+"="+tmpSum.to_s end end
修复后运行得到的@possibleSums结果符合预期:
{1=>[1], 3=>[1, 2], 6=>[1, 2, 3], 10=>[1, 2, 3, 4], 2=>[2], 5=>[2, 3], 9=>[2, 3, 4], 3=>[3],7=>[3, 4], 4=>[4]}
内容的提问来源于stack exchange,提问作者gkeepa
相关产品推荐
相关产品推荐

