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

时间:2014-08-29 16:55:52

标签: ruby

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

当我运行以下代码时

a = [[1,2],[3,4]]
b = a
b.each do |r|
  r[0] = r[0] + 1
end

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

4 个答案:

答案 0 :(得分:5)

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

当你说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)

因为ba指向同一个对象,这反过来意味着它们的元素是相同的对象。

要制作副本,请使用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"