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

Ruby数组引用传递问题:向矩阵子数组push值时全量同步的疑问

为什么Ruby数组修改一个子数组会影响所有子数组?解决方案看这里!

这问题我刚学Ruby的时候也踩过一模一样的坑!核心原因是Ruby中数组的引用传递特性,咱们一步步把问题拆明白:

你的第一个例子问题分析

当你写下这段代码时:

result = Array.new(matrix[0].length, [])

你可能以为是创建了3个独立的空数组,但实际上Array.new的第二个参数是同一个空数组对象。也就是说,result[0]、result[1]、result[2]都指向内存里的同一个数组。所以当你执行result[0] << 2时,你是在给这个共享的数组添加元素,自然所有子数组都会显示出变化。

解决第一个例子的方法

改用Array.new的块形式,块会为每个数组元素单独创建新的空数组:

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
result = Array.new(matrix[0].length) { [] } # 块会为每个索引生成新数组
result[0] << 2
result # 输出 [[2], [], []],完全符合预期!

矩阵转置函数的修复

你的转置函数遇到的是同一个问题——所有子数组共享同一个引用。只需要把创建result的代码改成块形式即可:

def transpose(matrix)
  # 用块创建独立的空数组,避免引用共享
  result = Array.new(matrix[0].length) { [] }
  matrix.each do |row|
    row.each_with_index do |el, col_idx|
      result[col_idx] << el
    end
  end
  result
end

# 测试验证:
transpose([[1,2,3],[4,5,6],[7,8,9]]) # => [[1,4,7], [2,5,8], [3,6,9]]

补充说明

Array.new(n, obj)会把obj的引用复制n次,所有元素共享同一个对象;而Array.new(n) { obj }会对每个索引执行一次块,每次都生成一个新的obj实例,这样每个元素都是独立的对象,修改其中一个不会影响其他。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:35:42