gpt4 book ai didi

ruby - 全局数组被函数改变

转载 作者:数据小太阳 更新时间:2023-10-29 09:03:32 25 4
gpt4 key购买 nike

我刚刚开始学习 Ruby,我在全局和局部变量作用域方面遇到了困难。

在做一道练习题时,我发现一个全局定义的数组正在被调用它的函数更改。如果我明确地将数组分配给其他东西,则没有任何变化。但是,如果我逐一删除项目,这会将它们从全局数组本身中删除。

为什么 deletepop(我也测试过)方法有这种行为?我从阅读中了解到,这不应该发生,函数内部的“数组”是对 arr 值的引用,而不是变量 arr

(我使用的是 Ruby 版本 2+)

def change_int x
x += 2
end

def change_arr array
array = [4, 5, 6]
end

def pop_arr array
puts array
new_array = []

while array.length > 0
new_array.push array[0]
array.delete_at 0
end

array
end

x = 5
change_int x
puts x == 5 # true

arr = [1, 2, 3]
change_arr arr
puts arr == [1, 2, 3] # true

old_arr = arr
puts pop_arr arr
puts arr == [1, 2, 3] # false
puts "arr = #{arr}" # arr = []

最佳答案

您可以在调用 pop_arr 之前打印 #object_id 并在 pop_arr 内部看到这些数组是相同的对象。这意味着在 Ruby 中参数通过引用传递给函数。

代码如下:

def pop_arr(array)
puts array.object_id
# Rest of the fucntion
end

arr = [1, 2, 3]
puts arr.object_id
pop_arr(arr)

所有这些意味着当您在函数内部编辑数组时,它将对传递的对象产生影响。 #delete#delete_at#pop 是更改其所在数组的操作。

关于ruby - 全局数组被函数改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29441062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com