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

问题描述 投票:-1回答:2
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调用更改方法后,bb的值已更改,aa的值未更改。

谁能解释为什么bb的值已更改而aa的值未更改。

ruby
2个回答
3
投票

第一行:

x = x + 5

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

第二行:

y[0] = y[0] + 5

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

因此,与第一行不同,第二行不更改变量– Array#[]=之后仍然引用相同的对象。是已更改的对象,而不是变量。因此,从外部可以看到更改。


0
投票
  1. 数组是可变对象,当您执行y时,它实际上会修改现有数组

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

  3. 现在您的case数组没有被分配更改,它已由array_object << somevalue运算符更改

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

<<

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

© www.soinside.com 2019 - 2024. All rights reserved.