プログラミング学習初めて2ヶ月ほど経ちました。
インプットばかりでアウトプットがおろそかになっているので、自分の学習の理解を深めるためにも学んだことを共有したいと思います。
今回は、newメソッドとinitializeメソッドについてまとめます。
newメソッドとは
公式リファレンスでnewはこう説明されています。
new(*args, &block) -> object[permalink][rdoc][edit]自身のインスタンスを生成して返します。このメソッドの引数はブロック引数も含め Object#initialize に渡されます。
new は Class#allocate でインスタンスを生成し、 Object#initialize で初期化を行います。
読んでもよくわからないので噛み砕いていきます。
インスタンス(実体)をつくる
newはクラスという「設計図」から、本物のオブジェクトをつくります。
#インスタンス名 = クラス名.new
book = Book.newこれは、「Bookという設計図から、bookという実体をつくって返して」という命令文。
引数をinitializeに引き継ぐ
User.new("Taro", 20)この"Taro", 20はそのままinitializeに渡されるという決まりになっています。
newの内部ではなにが起きている?
公式ではこう書かれています。
new は Class#allocate でインスタンスを生成し、 Object#initialize で初期化を行います。
つまり、
という流れ。
例えるなら、
allocate → 空の段ボールを作る
initialize → 中身を入れる
new → 全部まとめて返す便利メソッド
という関係です。
initializeメソッドとは
公式リファレンスでinitializeはこう説明されています。
initialize(*args, &block) -> object[permalink][rdoc][edit]ユーザ定義クラスのオブジェクト初期化メソッド。
このメソッドは Class#new から新しく生成されたオブジェクトの初期化のために呼び出されます。他の言語のコンストラクタに相当します。デフォルトの動作ではなにもしません。
initialize には Class#new に与えられた引数がそのまま渡されます。
上記説明をもとに、どういうことなのか詳しくみていきたいと思います。
initilaizeは「初期設定」をするメソッド
initializeは生まれたばかりのオブジェクトの初期設定をするメソッドです。
class User
def initialize(name)
@name = name
end
endnew を呼ぶと必ず initialize が自動で呼ばれ、@name に値が入る仕組み。
initialize は new によって自動で呼ばれる
自分でこう書くことはできません:
User.initialize("Taro") # エラーinitialize は private(外から呼べない) のため、new が呼んでくれるだけです。
initialize の引数は new の引数がそのまま渡る
User.new("Taro")
→ initialize("Taro") が呼ばれるこれは Ruby の仕様です。
newメソッドとinitializeメソッドまとめ
newメソッドは、インスタンスをつくりinitializeで初期化するメソッド。
initializeメソッドは、インスタンス生成直後の初期設定を行うメソッドのことだとわかりました。
最後にポイントをまとめます。
初学者には理解が違いを説明するのは難しいですが、まずは「newとinitializeはセットで動く」と覚えておくといいと理解しやすいと思います。
ここまで読んでいただきありがとうございました。