rubyのinitializeメソッドとは

リファレンスのinitializeメソッド解説を見ても一回で理解できなかったので、ここにまとめておきます。

ユーザ定義クラスのオブジェクト初期化メソッド。

このメソッドは Class#new から新しく生成されたオブ ジェクトの初期化のために呼び出されます。他の言語のコンストラクタに相当します。 デフォルトの動作ではなにもしません。

initialize には Class#new に与えられた引数がそのまま渡されます。

サブクラスではこのメソッドを必要に応じて再定義されること が期待されています。

initialize という名前のメソッドは自動的に private に設定されます。

ruby2.4.0リファレンス

具体例で考えればわかりやすい

例えば、ゲームのキャラクターを作るときHPが100でなきゃいけない場合を考えます。キャラクターを新たに作るときにHPが0だったらすぐにゲームオーバーで話にならないですよね。そんなことにならないようにあらかじめHPを決めておきます。

これをinitializeを使って表現しますと

class Monster
  # はじめのHPは100
  def initialize(hp=100)
    @hp = hp
  end
  def hp
    puts(@hp)
  end
end
pikachu = Monster.new
pikachu.hp   #=> 100

initializeを使わずに表現

もちろんinitializeを使わなくてもできます。

class Monster
  def hp=(hp)
    @hp = hp
  end
  def hp
    puts(@hp)
  end
end

pikachu = Monster.new
pikachu.hp = 100
pikachu.hp   #=> 100

この形でも問題ありませんが、チームでこのゲームを作っている場合、大本のMonsterを作っている人と個別のモンスターのpikachuやゼニガメを作っている人の間でミスが起こる場合があります。

ゼニガメのHPは200だと思い込んでたとか。それに何より初めからHPの値が決まっているならinitializeを使った方がいいに決まってます。

initializeメソッドはclassの中に入れておけば、newメソッドが実行される時に自動で動くので便利。