我看到一些奇怪的行为(或者我只是不理解它)。
当我运行以下代码时
a = [[1,2],[3,4]]
b = a
b.each do |r|
r[0] = r[0] + 1
end
a和b的值都发生了变化。为什么是这样?另外,如何制作原始阵列的副本以及新阵列的副本?感谢
答案 0 :(得分:5)
当你说b = a
时,你将同一个可变对象分配给两个变量。请考虑以下事项:
a = [[1,2],[3,4]]
b = a
a.object_id == b.object_id
#=> true
由于两个变量都指向同一个可变对象,因此对任一变量存储的对象进行更改会更改基础对象。现在考虑使用Enumerator#dup类继承的Array方法进行相同的操作:
a = [[1,2],[3,4]]
b = a.dup
a.object_id == b.object_id
#=> false
答案 1 :(得分:2)
因为b
和a
指向同一个对象,这反过来意味着它们的元素是相同的对象。
要制作副本,请使用dup
。要制作深层副本,请同时将dup
应用于元素。
答案 2 :(得分:0)
这种行为并不奇怪,当你做“b = a”时,这只是意味着现在b指向与a相同的对象。 a更改值,因为它是相同的内存位置。
答案 3 :(得分:0)
您可以通过" object_id"来理解它。方法
object_id :返回obj的整数标识符。
2.1.2 :101 > a= [[1,2],[3,4]]
=> [[1, 2], [3, 4]]
2.1.2 :102 > a.object_id
=> 70360382470860
2.1.2 :103 > b = a
=> [[1, 2], [3, 4]]
2.1.2 :104 > b.object_id
=> 70360382470860
2.1.2 :105 >
您可以使用" b = a.clone"