ruby设置a = b,对b执行操作,但也改变值

jhl*_*u87 0 ruby

我看到一些奇怪的行为(或者我只是不理解它).

当我运行以下代码时

a = [[1,2],[3,4]]
b = a
b.each do |r|
  r[0] = r[0] + 1
end
Run Code Online (Sandbox Code Playgroud)

a和b的值都发生了变化.为什么是这样?另外,如何制作原始阵列的副本以及新阵列的副本?谢谢

Tod*_*obs 5

具有相同对象ID的可变对象

当你说b = a你将同一个可变对象分配给两个变量时.考虑以下:

a = [[1,2],[3,4]]
b = a
a.object_id == b.object_id
#=> true
Run Code Online (Sandbox Code Playgroud)

由于两个变量都指向同一个可变对象,因此对任一变量存储的对象进行更改会更改基础对象.现在考虑使用Array类继承的Enumerator#dup方法执行相同的操作:

a = [[1,2],[3,4]]
b = a.dup
a.object_id == b.object_id
#=> false
Run Code Online (Sandbox Code Playgroud)