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

Ruby中向数组push哈希时旧值被覆盖的异常问题排查

Ruby数组插入哈希后所有元素均为最后一个值的问题解决

问题根源在于get_item_details方法内部重复复用了同一个哈希对象。Ruby中哈希属于引用类型,数组存储的是对象的引用而非值本身。当你每次调用该方法时,它只是修改了同一个哈希的属性值,并没有生成新的哈希实例,导致数组里所有元素最终指向的都是同一个对象,自然显示的都是最后一次修改后的结果。

解决方法

1. 修改get_item_details方法,返回新哈希实例

在方法内部每次初始化新的哈希对象,而非复用已有实例:

def get_item_details(item_code)
  # 每次创建全新的哈希
  item_data = {}
  # 替换为你的实际数据填充逻辑
  item_data[:name] = get_name_from_source(item_code)
  item_data[:price] = get_price_from_source(item_code)
  
  [true, item_data, 200]
end

2. 若无法修改原方法,存入数组前复制哈希

使用哈希的dup方法创建浅拷贝(如果哈希包含嵌套结构,Rails环境下可用deep_dup实现深拷贝):

@items_list = []

params[:items].each do |item|
  status, item_data, _status_code = get_item_details(item[:item_code])
  # 存入拷贝后的哈希,切断与原对象的引用关联
  @items_list << item_data.dup if status
end

验证

修改后重新运行代码,数组中的每个元素都会是独立的哈希实例,各自保存对应item_code的数据,不会再出现全部指向最后一个值的情况。

内容的提问来源于stack exchange,提问作者Kamesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:17:04