Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2010年11月19日(金)

dup と clone

| 11:43 | dup と clone - Going My Ruby Way を含むブックマーク はてなブックマーク - dup と clone - Going My Ruby Way dup と clone - Going My Ruby Way のブックマークコメント

dup は特異メソッドのコピーは行わない。close は行なう。

obj = Object.new

class << obj
  def m ; end
end

o2 = obj.clone
o3 = obj.dup

obj.m
o2.m
o3.m    # => NoMethodError

dupclone は参照するオブジェクトのコピーは行なわない。

深いコピーをする場合は Marshell を使う。

hash = {:a => {:name => "A"}}
h2 = hash.clone
h3 = hash.dup
h4 = Marshal.load Marshal.dump(hash)

hash[:a][:name] = "BBB"

hash[:a][:name] // "BBB"
h2[:a][:name]   // "BBB"
h3[:a][:name]   // "BBB"
h4[:a][:name]   // "A"