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]
使用参数aa
和bb
调用change方法后,bb
的值已更改,aa
的值未更改。
任何人都可以解释为什么bb
的值已更改而aa
的值未更改。
答案 0 :(得分:3)
第一行:
x = x + 5
为变量x
分配一个新值。新值仅在当前变量范围内有效,即在方法内有效。
第二行:
y[0] = y[0] + 5
也看起来像是一项作业,但不是。 y[0] = ...
是用于修改数组的方法调用Array#[]=
的语法糖。
因此,与第一行不同,第二行不更改变量-y
之后仍然引用同一对象。是已更改的对象,而不是变量。因此,从外部可以看到更改。
答案 1 :(得分:0)
数组是可变对象,当您执行array_object << somevalue
时,它实际上会修改现有数组
在方法中进行赋值时,它会在本地范围内创建/更改变量,这意味着它不会更改/影响方法外声明的变量。
现在您的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
您会发现它会更改值并在方法主体内打印新值,但在方法主体外仍会打印旧值(由于我在上面提到的第一点)。