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

Ruby嵌套数组异常:修改单个子数组却更新所有子数组

问题分析与解决办法

嘿,这个问题我刚学Ruby的时候也踩过一模一样的坑!你之所以改一个子数组,所有子数组都跟着变,核心原因是你创建的所有子数组其实都是同一个对象的引用。

为什么会出现这种情况?

当你用Array.new(5, Array.new())的时候,第二个参数Array.new()只会被执行一次,生成一个空数组对象,然后Ruby把这个对象的引用复制给新数组的每一个元素。也就是说,arr[0]、arr[1]……arr[4]指向的都是内存里同一个数组,你修改其中任何一个,其他的看起来也都变了——因为它们本来就是同一个东西!

正确的写法

要解决这个问题,你得让每个子数组都是独立的对象,这时候应该用块形式的Array.new:

arr = Array.new(5) { Array.new() } # => [[], [], [], [], []]
arr[0].push(1) # => [1]
arr # => [[1], [], [], [], []]

这里的块{ Array.new() }会为新数组的每一个元素单独执行一次,每次都生成一个全新的空数组,这样每个子数组都是独立的个体,修改其中一个就不会影响其他的了。

另外,你也可以手动初始化每个元素,效果完全一致:

arr = []
5.times { arr << [] }

这样就能得到真正独立的嵌套数组啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:48:26