You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:18:01