为什么对方法中的数组所做的更改是持久性的,而对整数的更改却不是

时间:2019-10-18 11:28:01

标签: ruby

aa = 5
bb = [5]

def change(x,y)
  x = x + 5
  y[0] = y[0] + 5
  puts "Done"
end

change(aa, bb)
p aa 
#=> 5
p bb
#=> [10]

使用参数aabb调用change方法后,bb的值已更改,aa的值未更改。

任何人都可以解释为什么bb的值已更改而aa的值未更改。

2 个答案:

答案 0 :(得分:3)

第一行:

x = x + 5

为变量x分配一个新值。新值仅在当前变量范围内有效,即在方法内有效。

第二行:

y[0] = y[0] + 5

也看起来像是一项作业,但不是。 y[0] = ...是用于修改数组的方法调用Array#[]=的语法糖。

因此,与第一行不同,第二行不更改变量-y之后仍然引用同一对象。是已更改的对象,而不是变量。因此,从外部可以看到更改。

答案 1 :(得分:0)

  1. 数组是可变对象,当您执行array_object << somevalue时,它实际上会修改现有数组

  2. 在方法中进行赋值时,它会在本地范围内创建/更改变量,这意味着它不会更改/影响方法外声明的变量。

现在您的case数组中没有被赋值更改,而是由<<运算符更改了

要验证这一点,您可以使用以下代码

aa = 5
bb = [5]

def change(x,y)
  x = x + 5
  y = y + [5]
  puts "Done #{x}  #{y}"
end

change(aa, bb)
p aa # Output 5
p bb # Output [5] <= not changed because we didn't use << operator

您会发现它会更改值并在方法主体内打印新值,但在方法主体外仍会打印旧值(由于我在上面提到的第一点)。