0

我在Ruby中遇到了以下问题

a = [1, 2, 3]
b = a
b.delete_at(1)
b => [1,3]
a => [1,3]
b.object_id => 70178446287080
a.object_id => 70178446287080

所以我对这个有点了解。a在 .处保存对数组的引用object_id

b也有对相同位置的引用作为b指向a它的点object_id。基本上它们指的是同一件事。因此,如果我对 , 的某些东西进行变异ba也会发生变异。

这种行为属于哪一类?是否有任何我可以记住的读数/一般做法,所以我将来不会有任何涉及此的错误?我知道这a.dup会在不同的位置提供一个新对象,所以a.dup == btrue。也为a.dup.object_id == b.object_id.

此外,在这种情况下,无论浅还是深dupclone本质上是一样的吗?

4

1 回答 1

0

两者都#dup创建#clone对象的浅表副本。但是,#clone做了两件#dup不做的事情:

  • 复制被复制对象的单例类
  • 保持复制对象的冻结状态

单例示例:

#重复:

a = Object.new

def a.foo do
  :foo 
end

p a.foo
# => :foo

b = a.dup
p b.foo
# => undefined method `foo' for #<Object:0x007f8bc395ff00> (NoMethodError)

#克隆:

a = Object.new

def a.foo do
  :foo 
end

p a.foo
# => :foo

b = a.clone
p b.foo
# => :foo

冻结状态示例:

a = Object.new

a.freeze
p a.frozen?
# => true

b = a.dup
p b.frozen?
# => false

c = a.clone
p c.frozen?
# => true

由于额外的步骤,#clone#dup(但这可能不会使您的应用程序太慢!)。

于 2015-02-02T11:18:13.910 回答