今回は、Rubyのinitializeメソッドを深く掘り下げていこうと思います。
Rubyのclassを定義する際にセットで出てくるメソッドですが、しっかりと理解できているでしょうか?
initializeメソッドは簡単に言ってしまうと、classをnewした(インスタンス化)時にデータを初期化しています。
ここまでは理解している方でも、以下のことは理解していますか?
- initializeは外部から呼ぶことができない
- 初期化する必要性・利便性
- allocateメソッドとnewメソッドの違い
今回は、今までなんとなくinitializeメソッドを使っていた自分に向けても書いているので、私と同じ状況の方にも役に立つと思います。
ぜひこの機会に、initializeメソッド周りの知識を強化しましょう。
ここからは、クラスからインスタンスを生成する過程に沿って説明していきます。
インスタンス生成過程
newメソッドを使ったパターン
newメソッドを使ってインスタンスを生成するのは、普段よくやっているのではないでしょうか?
こちらは一般的なインスタンスの生成方法です。下のコードを見てみましょう。
上記のコードのように、インスタンスを生成してhelloメソッドを呼ぶ前に、initializeメソッドが実行されてインスタン変数が初期化され「Hello, World!」という文字列がセットされています。
そのためhelloメソッドを実行すると、@helloというインスタンス変数がしっかり実行できて、「Hello, World!」という文字列が出力されます。
またインスタンスを生成する際に、引数を設定することで任意のインスタンス変数をinitializeメソッドでセットすることができます。
逆に引数をセットせずにSampleUseArgumentクラスからインスタンスを生成しようとすると、上記のようなエラーが出力されます。
ここまでは、基本的なインスタンスの生成方法ですね。
allocateメソッドを使ったパターン
次にallocateメソッドを使って、インスタンスを生成するパターンを見ていきましょう。
以下のコードをご覧ください。
このようにallocateメソッドは、newメソッドと同じようにインスタンスを生成しているように見えますが、実は異なる点があります。
まず一つ目の違いは、インスタンスを生成する時にinitializeメソッドが最初に呼ばれないことです。initializeメソッドの中で、「@hello」というインスタンス変数を初期化する処理がありますが、それが実行されていません。
二つ目の違いは、Sample.allocate.hello
を実行した時に、@hello(インスタンス変数)が無いからエラーになることはありません。インスタンス変数の部分は空欄になって出力されます。逆にnewメソッドのように、インスタンス変数に引数を渡すようにすると、引数エラーが出ます。(SampleUseArgument.allocate("Hello, Shin!").hello
)
このような違いがnewとallocateメソッドにはあります。
話は少しずれますが、allocateメソッドでinitializeメソッドを先に実行してインスタンス変数をセットしようと、Sample.allocate.initialize.hello
としてみますが、結果はエラーになってしまいます。initializeメソッドは外部から呼び出せないような設定になっているからです。
Rubyのinitializeメソッドを使う必要性・利便性
最後に「なぜinitializeメソッドを使うのか」ということです。
理由はクラスからインスタンスを生成する際、初期値として設定しておきたいデータを一括で管理できるからです。
特に威力を発揮するのは大きなクラスの時で、大きなクラスになる程たくさんのインスタンス変数を設定したり、データを初期化しておきたい場面が増えます。
そんな時、initializeメソッドを使えば一元管理できるので、コードの可読性が上がります。
試しにinitializeメソッドが無い場合を考えてみると、インスタンス生成時に必ずやる処理をそれぞれのメソッドが持つことになってしまいます。するとコードの重複も増えますし、エラーが出た際の対応も遅れてしまいます。
結果的に、initializeメソッドのような存在が欲しくなるでしょう。
まとめ
今回は、クラスからインスタンスを生成する過程を通して、initializeメソッドを見ていきました。
「initializeメソッドとはなんなのか・initializeメソッドがなぜ必要なのか・インスタンス生成時どのような動きをするのか」がnewメソッドとallocateメソッドを比較して見ることで、理解が進んだのではないでしょうか?
みなさんの理解に少しでも力添えできたら嬉しく思います。ついでに、自分の理解が整理されたら一石二鳥だなということでした。
コメントを残す