我看到一些奇怪的行为(或者我只是不理解它).
当我运行以下代码时
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的值都发生了变化.为什么是这样?另外,如何制作原始阵列的副本以及新阵列的副本?谢谢
当你说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)