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

