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

bbは、その を参照するポイントとしてa、その同じ位置への参照も持っていobject_idます。基本的には同じものを指します。したがって、何かを変更するとbaも変更されます。

この動作はどのカテゴリに分類されますか? これに関連して将来エラーが発生しないように、記憶できる読み物/一般的な慣行はありますか? 私はそれa.dupが別の場所に新しいオブジェクトを提供することを知っているa.dup == bのでtrue. にもa.dup.object_id == b.object_id

また、浅い対深いに関係なく、この状況では本質的に同じことですかdup?clone

4

1 に答える 1

0

と の両方で、オブジェクトの浅いコピーを作成します#dup#cloneただし、次の#clone2 つのことは#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 に答える