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

