【Ruby入門】classのnewとinitializeについてまとめ

【Ruby入門】classのnewとinitializeについてまとめ

こんにちは!Webコーダー・プログラマーの貝原(@touhicomu)です。

今日は、Rubyclassの定義、newメソッド、inistializeメソッドについて解説します。

この記事では、

  • classを定義する方法
  • classをnewで作成する方法
  • newとinitializeの関係

という基本的な内容から、

  • initializeの基本的な使い方
  • initializeの応用的な使い方

などの応用的な使い方に関しても学習していきます。

このページで、Ruby classの定義、newメソッド、inistializeメソッドの使い方をよく把握して自分のスキルとしていきましょう!

classとは

classとは、プログラムの中で使う変数などのデータとそのデータを取り扱うメソッドをひとかたまりにまとめたものです。

データはclassのメソッドにより値を取得したり値を変更したりするようにします。

このようにすることで、classのデータを取得するコード、変更するコードがclassの中だけに集まることになります。

このことにより、コードを保守したり、今後の開発の進捗や仕様変更時に、コードを変更する箇所を、classのデータやメソッドを変更するだけですみます。

このように、classを導入することによりコードの保守や変更に対して、開発効率が高まるというメリットがあります。

classを定義する方法

Rubyclassを使うには、まず、コード中でclassを定義する必要があります。

以下、疑似コードで確認しましょう。

上のコードは、classを定義するのに最低限のコードです。

まず、classの後にクラス名があります。

また、class~endの間にinitializeメソッドがあります。

initializeメソッドはclassがnewされた際に呼び出されるメソッドで、主にclassのデータの初期化処理を行います。

まずは、コード中でclassの定義は上の例のように行うということを覚えておいてください。

classをnewで作成する方法

classの定義はしましたが、そのままではclassをコード中で使用できません。

classのnewメソッドによって、classをインスタンス化する必要があります。

インスタンス化とは、classの定義をもとに新たな変数を作成することです。

具体的な例を見てみましょう。

実行結果:

上のコードでは、Hello.newメソッドを使って、Helloクラスをインスタンス化、つまり変数化しています。

その後、変数helloに対してtalkメソッドを実行するよう命令しています。

その結果、Helloクラスのtalkメソッドが実行され、「hello, world」が出力されています。

このように、classは定義したままでは使用できず、newメソッドによりインスタンス化して初めて、classのメソッドが使用できるようになります。

newとinitializeの関係

今までの章でclassとnewメソッドに関係がわかりました。

では、initializeメソッドはどのような用途に使用されるのでしょうか?

initializeメソッドはnewメソッドが呼び出された際に呼び出されます。

また、newメソッドに渡された変数も、そのままinitializeメソッドに渡されます。

これを利用し、initializeメソッドでは引数を元にclassのデータの初期化を行います。

これがinitializeメソッドの主な用途です。

実際のサンプルコードを見ていきましょう。

実行結果:

以上のように、newメソッドに渡した引数がinitializeメソッドの引数nameとして渡されています。

initializeメソッドでは引数nameを元にクラス変数@@name初期化しています。

最後に、変数helloに対しtalkメソッドを実行し、クラス変数@@nameに従った出力を行っています。

クラス変数がわからないという方はこちらの記事を参考にしてください。

クラス変数、インスタンス変数、クラスインスタンス変数の違いがわかりやすくまとめられています。

initializeの基本的な使い方

initializeを使う方法

前章でも述べた通り、Rubyのクラスのinitializeメソッドはクラスがnewされた際に一度だけ実行されるメソッドです。

initializeメソッドはクラスの初期化を行いことが主な役目です。

もう一つ、実際にサンプルコードを確認してみましょう。

実行結果:

上のコードでは、クラス変数の代わりにクラスのインスタンス変数を使用しています。

classのインスタンス化時に、newの引数に”Kevin”を与えて実行しています。

newが呼ばれた際にHelloクラスのinitializeメソッドが呼び出され、newの引数initializeの引数に渡されます。

initializeでは、引数をもとにインスタンス変数@username初期化しています。

その後Helloクラスのtalkメソッドを呼び出した際に、@usernameがきちんと初期化した通り表示されています。

このように、newメソッドに渡した引数をinitializeメソッドでクラス変数やインスタンス変数を初期化します。

その後、talkなどのインスタンスメソッドで初期化されたクラス変数やインスタンス変数を使用し、データを加工して実行することがclassとnew、initializeの基本的な使用方法です。

複数のinitializeは定義できない

initializeは複数定義してオーバーロードできません。

実際に例をみてみましょう。

実行結果:

Helloクラスの一番目のinitializeメソッドを使用しようとするとエラーがでます。

これは、一番目のinitializeメソッドの定義が、二番目のinitializeメソッドの定義で上書きされてしまっているからです。

そのため、一番目のinitializeメソッドの定義はもう存在せず、それを使おうとするとエラーとなります。

子クラスから親クラスのinitializeを呼ぶ方法

クラスは、そのデータメソッドをそのまま引き継いで、子供のクラスを作成できます。

子供のクラスのことを子クラスと言います。

親クラスから子クラスへデータやメソッドを引き継ぐことを継承と言います。

継承した子クラスから親クラスのinitializeメソッドを呼ぶには、superというメソッドを呼びます。

superとは親という意味で、superメソッドが親クラスのinitializeメソッドにつながっています。

実行結果:

子クラスで受け取ったnamesuperに渡して、親クラスのinitializeメソッドを呼び出し、変数@nameを初期化できています。

子クラスwho?メソッドでも親クラスの@nameを使用できています。

initializeでのreturnとorverrideについて

initializeでのreturn

initializeメソッド内ではreturnは使えません。

以下、実際のコードで確かめてみましょう。

実行結果:

return したsがs2に入っているはずですが、両者は別のオブジェクトとして判定されていますね。

これは、newの返値はinitializeの返値ではなく、初期化されたオブジェクトであるためです。

initializeの返値は使用されません。

そのためreturnしても返値は使用されません。

initializeでのorverride

initializeメソッド重複して定義するたびに、最後に定義されたinitializeメソッドが使用されます。

実際にコードで確認してみましょう。

以下のコードではArrayクラスに新たにinitializeメソッドを定義して通常のArrayのinitializeメソッドを上書き(override)しています。

このカスタマイズしたArrayクラスのインスタンス変数は通常の配列としても使用できています。

実行結果:

以上のように、組み込みクラスArrayであっても、initializeメソッドをoverrideできます。

また、initializeをoverrideしてカスタマイズしたArrayは、通常の配列(Array)としても使用できています。

まとめ

今回は、Ruby classの定義、newメソッド、inistializeメソッドについて学習しました!

学習のポイントを振り返ってみましょう!

  • classは定義した後、newメソッドでインスタンス化して使用する。
  • newメソッドを実行した際に、initializeメソッドが実行される。
  • newメソッドの引数は、そのままinitializeメソッドに渡される。
  • initializeメソッドは複数は用意できない。initializeを定義するたびに以前のinitializeが上書きされる。
  • superメソッドによって、子クラスから継承元の親クラスのinitializeメソッドを呼び出せる。
  • initializeメソッドではreturnできない。

以上の内容を再確認し、ぜひ自分のプログラムに生かし学習を進めてください!

未来に繋がるプログラミング学習、できていますか?

エンジニアと一口にいっても、フロントエンド、サーバーサイド、アプリ開発、AI関連など様々な業界や職種があり、業務内容や働き方、年収は変わります。

どんな働き方をしたいのか、どのくらい年収が欲しいのかなど具体的なキャリアパスを考えて、それを達成できる学習カリキュラムを考えていかないと、希望する方向性とは違うエンジニアになってしまったり、遠回りの学習に時間を費やしてしまう可能性があります。

侍エンジニア塾では目的から逆算する形で、まずあなたの目指すキャリアをヒアリングさせて頂いてからそれを達成するためのオリジナルの学習カリキュラムを作成しています。

今学んでいることが理想のエンジニアになるために繋がっているか不安でしたら、下記の無料体験レッスン予約カレンダーよりお気軽にご相談ください。

LINEで送る
Pocket

書いた人

貝原 輝昌

貝原 輝昌

こんにちは!貝原(@touhicomu)と申します。
現在は、Web業界のフリーランスとして、主にPHP/WordPress/BuddyPress/VPSサーバー構築などの業務を受注しています。
現住所は、日本の西海岸、長崎県は波佐見町です。田舎ライフです。^^
地元の観光団体「笑楽井石」にボランティアでほたる撮影会やそば塾などのスタッフとして参加させて頂いています。
以下の活動も行っています。
 ・笑楽井石のブログ
 ・エクセル関数を日本語化するソフト
 ・エクセルVBAを日本語で記述するソフト

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説