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

Ruby中修改多维数组单元素却改变整列的问题排查

问题原因

你在initialize方法中只初始化了1次tmpArray数组对象,后续所有行的赋值@arr[i] = tmpArray本质上都是将同一个数组的引用绑定到了每一行。此时矩阵所有行实际指向同一个数组实例,修改任意行的任意位置都会同步作用到所有行的对应位置,就出现了修改单个元素却更新了一整列的问题。

修复方案

只需要调整initialize方法的逻辑,保证每一行都使用独立的数组对象即可,有两种实现方式:

  • 方式一:保持原有循环结构,将tmpArray的初始化放到行循环内部,每次创建新的行数组
    def initialize(r, c, n = "a")
        @rows = r
        @cols = c
        @arr = Array.new(@rows)
    
        i = 0
        while i < @rows
            # 每行创建独立的临时数组
            tmpArray = Array.new(@cols)
            j = 0
            while j < @cols
                tmpArray[j] = n
                j += 1
            end
            @arr[i] = tmpArray
            i += 1
        end
    end
    
  • 方式二:使用Ruby更简洁的数组初始化语法,避免手动编写循环,天然避免引用共享问题
    def initialize(r, c, n = "a")
        @rows = r
        @cols = c
        # 块内逻辑会为每行生成独立的新数组
        @arr = Array.new(@rows) { Array.new(@cols, n) }
    end
    
    注意不要写成@arr = Array.new(@rows, Array.new(@cols, n)),这种写法还是会复用同一个行数组,依然会出现引用共享问题。
验证结果

修改后运行测试代码,输出就会符合预期:

( 1 0 )
( 0 0 )

内容的提问来源于stack exchange,提问作者Simeón

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:54:04