【发布时间】:2021-09-28 20:41:23
【问题描述】:
我正在学习 Ruby,并且一直在通过解决 Codewars 和 Leetcode 上的问题来练习。我在 Leetcode 中遇到过这个问题,它要求我在给定一个数组和一个值的情况下,通过删除数组中给定值的出现来修改数组。很简单!我能够解决它——但是,这奇怪的事情发生了,我不知道为什么! 这是我的代码:
def remove_element(nums, val)
nums.each_with_index do |num, index|
if num == val
nums[index] = nil
end
end
nums.compact!
nums.length
end
你可以在这里看到我在第 4 行写了“nums[index] = nil”,这对我来说效果很好。然而,在很长一段时间里,我一直试图通过写“num = nil”来解决这个挑战。对我来说没有意义的是,为什么“nums [index]”有效而不是“num”?他们指的不是同一个东西吗?
【问题讨论】:
-
num是块局部变量,nums是数组。修改本地参数与访问引用不同。再举一个例子,假设数组中填充了对象。num.some_property = 5会修改数组条目的属性,num = SomeNewObject.new只会创建一个新对象而不修改数组条目。如果你调用一个函数也会发生同样的事情。