rubyのnew、initializeメソッドについて学んだことをアウトプットするアイキャッチ画像。

【Ruby】newメソッドとinitializeメソッドを理解する

プログラミング学習初めて2ヶ月ほど経ちました。

インプットばかりでアウトプットがおろそかになっているので、自分の学習の理解を深めるためにも学んだことを共有したいと思います。

今回は、newメソッドとinitializeメソッドについてまとめます。

newメソッドとは

公式リファレンスでnewはこう説明されています。

new(*args, &block) -> object[permalink][rdoc][edit]

自身のインスタンスを生成して返します。このメソッドの引数はブロック引数も含め Object#initialize に渡されます。

new は Class#allocate でインスタンスを生成し、 Object#initialize で初期化を行います。

引用元:Ruby 3.4 リファレンスマニュアル

読んでもよくわからないので噛み砕いていきます。

インスタンス(実体)をつくる

newはクラスという「設計図」から、本物のオブジェクトをつくります。

#インスタンス名 = クラス名.new
book = Book.new

これは、「Bookという設計図から、bookという実体をつくって返して」という命令文。

引数をinitializeに引き継ぐ

User.new("Taro", 20)

この"Taro", 20はそのままinitializeに渡されるという決まりになっています。

newの内部ではなにが起きている?

公式ではこう書かれています。

new は Class#allocate でインスタンスを生成し、 Object#initialize で初期化を行います。

つまり、

new内部でおきていること

  1. allocate:空のオブジェクトをつくる。
  2. initialize:初期設定をする。
  3. 完成したオブジェクトを返す。

という流れ。

例えるなら、

allocate → 空の段ボールを作る

initialize → 中身を入れる

new → 全部まとめて返す便利メソッド

という関係です。

initializeメソッドとは

公式リファレンスでinitializeはこう説明されています。

initialize(*args, &block) -> object[permalink][rdoc][edit]

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

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

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

引用元:Ruby 3.4 リファレンスマニュアル

上記説明をもとに、どういうことなのか詳しくみていきたいと思います。

initilaizeは「初期設定」をするメソッド

initializeは生まれたばかりのオブジェクトの初期設定をするメソッドです。

class User
  def initialize(name)
    @name = name
  end
end

new を呼ぶと必ず initialize が自動で呼ばれ、@name に値が入る仕組み。

initialize は new によって自動で呼ばれる

自分でこう書くことはできません:

User.initialize("Taro") # エラー

initialize は private(外から呼べない) のため、new が呼んでくれるだけです。

initialize の引数は new の引数がそのまま渡る

User.new("Taro") 
initialize("Taro") が呼ばれる

これは Ruby の仕様です。

newメソッドとinitializeメソッドまとめ

newメソッドは、インスタンスをつくりinitializeで初期化するメソッド。

initializeメソッドは、インスタンス生成直後の初期設定を行うメソッドのことだとわかりました。

最後にポイントをまとめます。

newメソッド

  • newメソッドはClassクラスに定義されているメソッド
  • 呼び出すと、新しいオブジェクト(インスタンス)を生成する
  • 生成後、initializeメソッドを自動で呼び出す

initializeメソッド

  • クラス内で定義すると、new が呼ばれたときに自動で実行される
  • 返り値は無視される(必ずオブジェクト自体が返るため)
  • オブジェクトの初期値の設定に使う

初学者には理解が違いを説明するのは難しいですが、まずは「newとinitializeはセットで動く」と覚えておくといいと理解しやすいと思います。

ここまで読んでいただきありがとうございました。

-Ruby
-, , ,

Translate »