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
相关产品推荐
相关产品推荐

