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

Ruby:如何避免数组传入方法后被修改?

问题原因与解决方案

原数组被修改的原因

在Ruby中,xArray = inputArray并不是创建数组的副本,只是让xArray和inputArray指向同一个数组对象。所以你对xArray执行delete_at操作时,本质上是在修改原数组,导致inputArray的长度变为0。

修复方法:创建数组副本

要避免修改原数组,你需要创建原数组的独立副本,Ruby中可以用dup或clone方法:

xArray = inputArray.dup

修改后的完整代码:

# inputArray 是包含A到Z大写字母的数组
def populate_array(inputArray)
    xArray = inputArray.dup # 创建原数组的副本
    yArray = []

    i = 0
    while yArray.length < 26
        x = rand(26 - i)
        yArray[i] = xArray[x]
        xArray.delete_at(x)
        i += 1
    end
    yArray # 记得返回结果,否则方法默认返回nil
end

inputArray = ('A'..'Z').to_a
result = populate_array(inputArray)

puts "inputArray length: #{inputArray.length}"
puts "yArray length: #{result.length}"

注:Ruby方法名一般用蛇形命名法(populate_array而非populateArray),同时方法需要返回yArray,否则调用后拿不到结果。

更简便的实现方式

你的需求本质是生成原数组的随机无重复排列,Ruby内置了shuffle方法可以直接完成这个操作,无需手动写循环:

inputArray = ('A'..'Z').to_a
yArray = inputArray.shuffle # 直接生成随机打乱的数组,原数组不受影响

puts "inputArray length: #{inputArray.length}"
puts "yArray length: #{yArray.length}"

shuffle方法会返回一个新数组,原数组保持不变,完全满足你的需求,代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 17:40:44