Rubyリファレンス: Home

initialize_copy

Edit   History

標準クラス・モジュール > Object > initialize_copy

def initialize_copy(original_obj)
  code...
end

initialize_copyメソッドは、オブジェクトがコピーされるときに初期化を行うメソッドです。clone, dupメソッドを呼び出すと、この2つのメソッドはオブジェクトのコピーを行ったあとで、initialize_copyメソッドを呼び出します。引数にはコピー元のオブジェクトが渡されます。なお、initialize_copyの戻り値は使われません。

自作のクラスでinitialize_copyを定義すると、clonedupが呼ばれたときのオブジェクトの状態を変えられます。initialize_copyprivateを使わなくても自動的にprivateなメソッドになります。

次のBookクラスのinitialize_copyメソッドでは、インスタンス変数@titledupメソッドでコピーしています。これにより、コピー元とコピー先の@titleは同じ文字列への参照(浅いコピー)ではなく、別のオブジェクト(深いコピー)になります。

class Book
  attr_accessor :title, :price
  def initialize(title, price)
    @title = title; @price = price
  end
  def initialize_copy(obj)
    puts "initialize_copy is called!"
    @title = obj.title.dup
  end
end
 
original = Book.new('Programming Ruby', 1980)
copied = original.dup
puts copied.title.equal?(original.title)
initialize_copy is called!
false

関連項目