.net column
.NET開発者のためのブログメディア

Railsにおいてinitializeを使うときのポイント|サンプルコードも紹介

2020年07月14日
SE
Rubyのコンストラクタとはどのようなものですか。
PM
Rubyのコンストラクタとは、主にクラスのデータ初期化処理を行う特別なメソッドのことです。

Railsにおけるコンストラクタ「initialize」とは


Rubyのコンストラクタとは、主にクラスのデータを初期化する特別なメソッドです。「initialize」という名前である必要があります。

コンストラクタはオブジェクト生成時に自動的に呼び出されます。

もちろん、初期化処理をする必要がなければコンストラクタを記述する必要がありません。コンストラクタを作成せずに、初期化用のクラスメソッドを用意してもよいです。

コンストラクタを利用すれば、newで自動的に呼び出されるので、わざわざ初期化用のメソッドを呼び出す必要がありません。

Railsにおけるコンストラクタを使うときのポイント7つ


今回は、Rubyのコンストラクタについて説明します。Rubyのコンストラクタとは、主にクラスのデータ初期化処理を行う特別なメソッドです。

Rubyのコンストラクタに興味のある方はぜひご覧ください。

1:initializeが持つnewとの関係性を把握する

initializeは、newメソッドから変数を渡される関係にあります。

newメソッドに渡した引数がinitializeメソッドの引数nameとして渡されている例を紹介します。

実行結果は、

です。

2:インスタンス変数の初期化

インスタンス変数は、@変数名で定義します。コンストラクタでインスタンス変数を初期化するには、以下のように記述します。

実際のソースコードを見てみましょう。

newの引数で渡されるname, ageをコンストラクタで初期化しています。

インスタンス変数はprivate扱いになります。また、クラス外からアクセスするには、ゲッター/セッターメソッドが必要です。

Rubyでは、アクセサメソッドが用意されています。使い方は「attr_accessor :変数名」と記述するだけです。ゲッター/セッターメソッドを自作しなくて良いので楽です。

アクセサメソッドを使ったソースコードを見てみましょう。

実行結果は以下のようになります。


コンストラクタで初期化し、アクセサメソッドで読み書きできることが分かります。

なお、person = Person.new()とすると、以下のように引数エラーになります。
wrong number of arguments (given 0, expected 2) (ArgumentError)

また、アクセサの設定は、以下のようにも記述できます。
attr_reader :変数名 → ゲッターのみ
attr_writer :変数名 → セッターのみ


用途に応じてアクセサの設定を変更してください。

3:キーワード引数

キーワード引数を指定して、初期化することもできます。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

キーワード引数にすることで、引数の順番を気にする必要がなくなります。また、直感的に分かりやすいと思います。

このように、キーワード引数を指定して、初期化することもできます。

4:コンストラクタのreturn

Rubyのコンストラクタはreturnできません。実行時エラーにはなりませんが、returnする意味がありません。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

コンストラクタからnilをreturnしていますが、インスタンス変数は設定されています。実行時エラーにはなりませんが、returnする意味がありません。

生成されたオブジェクトが返却されるので、returnを書く必要がありません。

5:コンストラクタのオーバーロード

Rubyのコンストラクタは複数定義できません。つまり、コンストラクタはオーバーロードできません。

実際のソースコードを見てみましょう。

実行結果は以下のようになります

コンストラクタを複数定義してもエラーにはなりませんが、最後のコンストラクタのみが有効になります。

そのため、person1 = Person.new(“Taro”)を実行すると、ArgumentErrorが発生します。このように、コンストラクタはオーバーロードできません。

6:コンストラクタのオーバーライド

Rubyでは、クラスを継承して、コンストラクタをオーバーライドできます。つまり、サブクラスで必要に応じて再定義できるということです。

実際のソースコードを見てみましょう。

実行結果は以下のようになります。

サブクラスのコンストラクタからスーパークラスのコンストラクタをsuperメソッドで呼び出しています。

サブクラスでは、新たにインスタンス変数student_noを追加しています。このように、クラスを継承して、コンストラクタをオーバーライドできます。

7:親クラスと子クラスの関係性を理解する

Ruby on Railsにおいて、superメソッドを利用することで親クラスの引数を子クラスに全部自動的に呼び出します。

例えば、

こちらのコードを実行すると、

となります。

Railsでのinitializeを使ったサンプルコード


実際にRailsにおいてHumanクラスを作成して名前を設定するコードは、

このようなコードになります。実際に書いてみると、

このコードを実行すると「私がいます」と出力されます。

SE
Rubyにはコンストラクタであるinitializeメソッドが用意されているのですね。
PM
実際にソースコードを自分で書いてみると、もっと理解が深まりますよ。

Rubyのソースコードを書いてみよう


Rubyにはコンストラクタであるinitializeメソッドが用意されています。基本的に、初期化処理はコンストラクタで行います。

また、クラスを継承して、コンストラクタをオーバーライドできます。ぜひご自身でRubyのソースコードを書いて、理解を深めてください。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags