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

Ruby中数组推入数组结果不符合预期问题排查

解决Ruby数组推入数组时结果不符的问题

我来帮你捋清楚这个问题——你遇到的其实是Ruby中引用类型的经典坑!

问题根源

Ruby里的数组是引用类型,也就是说你每次往combined_array里添加的array其实是同一个数组对象的内存引用,而不是它的独立副本。当你后续执行array[i], array[j] = array[j], array[i]交换元素时,之前已经存入combined_array的“数组”也会跟着改变——因为它们指向的是同一个内存地址。

而且你代码里的array.to_a并没有起到创建副本的作用:因为array本身就是Array类的实例,调用to_a只会返回它自己,不会生成新数组。

解决方案

要解决这个问题,你需要在每次推入combined_array时,创建当前数组的独立副本。对于一维数组来说,浅拷贝就足够了,Ruby提供了几种简单的方式:

  • array.dup:创建数组的浅拷贝,生成新的数组对象
  • array.clone:和dup类似,但会保留原数组的冻结状态等额外属性
  • [*array]:通过展开数组的方式创建新数组

修改后的代码示例

@arr = ["e", "s", "l", "e"]

def permutations(array, i=0)
  combined_array = Array.new
  (i..array.size-1).each do |j|
    array[i], array[j] = array[j], array[i]
    puts "ARRAY : #{array}"
    # 这里用dup创建当前数组的副本,再推入combined_array
    combined_array << array.dup
  end
  return combined_array
end

# 测试运行
result = permutations(@arr)
puts "\n最终的combined_array:"
p result

运行效果

现在combined_array里的每个元素都是独立的数组对象,后续对原数组的修改不会影响已经存入的元素,你会得到每次交换操作后的真实数组状态,而不是最后一次修改后的统一结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:53:29