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

- システム
エンジニア - Rubyのコンストラクタとはどのようなものですか。
- プロジェクト
マネージャー - Rubyのコンストラクタとは、主にクラスのデータ初期化処理を行う特別なメソッドのことです。
Railsにおけるコンストラクタ「initialize」とは
Rubyのコンストラクタとは、主にクラスのデータを初期化する特別なメソッドです。「initialize」という名前である必要があります。
コンストラクタはオブジェクト生成時に自動的に呼び出されます。
1 2 3 4 5 6 7 8 9 10 |
class クラス名 # コンストラクタ def initialize() 初期処理 end end hoge = クラス名.new() |
もちろん、初期化処理をする必要がなければコンストラクタを記述する必要がありません。コンストラクタを作成せずに、初期化用のクラスメソッドを用意してもよいです。
1 2 3 4 5 6 7 8 9 10 11 |
class クラス名 # クラスメソッド def init() 初期処理 end end hoge = クラス名.new() hoge.init() |
コンストラクタを利用すれば、newで自動的に呼び出されるので、わざわざ初期化用のメソッドを呼び出す必要がありません。
Railsにおけるコンストラクタを使うときのポイント7つ
今回は、Rubyのコンストラクタについて説明します。Rubyのコンストラクタとは、主にクラスのデータ初期化処理を行う特別なメソッドです。
Rubyのコンストラクタに興味のある方はぜひご覧ください。
1:initializeが持つnewとの関係性を把握する
initializeは、newメソッドから変数を渡される関係にあります。
newメソッドに渡した引数がinitializeメソッドの引数nameとして渡されている例を紹介します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Hello # 名前を保持するクラス変数 @@name = nil # クラスの初期化メソッド def initialize(name) @@name = name end # クラスのインスタンスメソッド def talk puts "hello, #{@@name}" end end # classのnewメソッドに引数を渡す hello = Hello.new("jobs") # newメソッドからinitializeメソッドに渡って初期化された名前が使用される hello.talk |
実行結果は、
1 |
hello, jobs |
です。
2:インスタンス変数の初期化
インスタンス変数は、@変数名で定義します。コンストラクタでインスタンス変数を初期化するには、以下のように記述します。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 |
class Person # コンストラクタ def initialize(name, age) @name = name @age = age end end person = Person.new("Taro", 30) |
newの引数で渡されるname, ageをコンストラクタで初期化しています。
インスタンス変数はprivate扱いになります。また、クラス外からアクセスするには、ゲッター/セッターメソッドが必要です。
Rubyでは、アクセサメソッドが用意されています。使い方は「attr_accessor :変数名」と記述するだけです。ゲッター/セッターメソッドを自作しなくて良いので楽です。
アクセサメソッドを使ったソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
class Person # コンストラクタ def initialize(name, age) @name = name @age = age end # アクセサの設定 attr_accessor :name, :age end person = Person.new("Taro", 30) puts person.name # Taro puts person.age # 30 person.name = "Hanako" person.age = 20 puts person.name # Hanako puts person.age # 20 |
実行結果は以下のようになります。
1 2 3 4 5 |
Taro 30 Hanako 20 |
コンストラクタで初期化し、アクセサメソッドで読み書きできることが分かります。
なお、person = Person.new()とすると、以下のように引数エラーになります。
wrong number of arguments (given 0, expected 2) (ArgumentError)
また、アクセサの設定は、以下のようにも記述できます。
attr_reader :変数名 → ゲッターのみ
attr_writer :変数名 → セッターのみ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Person # コンストラクタ def initialize(name, age) @name = name @age = age end # アクセサの設定 attr_reader :name attr_writer :age end person = Person.new("Taro", 30) puts person.name # Taro # puts person.age # ageはreadできない #person.name = "Hanako" # nameはwriteできない person.age = 20 puts person.name # Hanako # puts person.age # ageはreadできない |
用途に応じてアクセサの設定を変更してください。
3:キーワード引数
キーワード引数を指定して、初期化することもできます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Person # コンストラクタ def initialize(name:, age:) @name = name @age = age end # アクセサの設定 attr_accessor :name, :age end person1 = Person.new(name: "Taro",age: 30) puts person1.name # Taro puts person1.age # 30 person2 = Person.new(age: 20, name: "Hanako") puts person2.name # Taro puts person2.age # 30 |
実行結果は以下のようになります。
1 2 3 4 |
Taro 30 Hanako 20 |
キーワード引数にすることで、引数の順番を気にする必要がなくなります。また、直感的に分かりやすいと思います。
このように、キーワード引数を指定して、初期化することもできます。
4:コンストラクタのreturn
Rubyのコンストラクタはreturnできません。実行時エラーにはなりませんが、returnする意味がありません。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Person # コンストラクタ def initialize(name, age) @name = name @age = age return nil end # アクセサの設定 attr_accessor :name, :age end person = Person.new("Taro", 30) puts person.name # Taro puts person.age # 30 |
実行結果は以下のようになります。
1 2 |
Taro 30 |
コンストラクタからnilをreturnしていますが、インスタンス変数は設定されています。実行時エラーにはなりませんが、returnする意味がありません。
生成されたオブジェクトが返却されるので、returnを書く必要がありません。
5:コンストラクタのオーバーロード
Rubyのコンストラクタは複数定義できません。つまり、コンストラクタはオーバーロードできません。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class Person # コンストラクタ1 def initialize(name) @name = name end # コンストラクタ2 def initialize(name, age) @name = name @age = age end # アクセサの設定 attr_accessor :name, :age end # person1 = Person.new("Taro") # wrong number of arguments (given 1, expected 2) (ArgumentError) # puts person1.name # Taro person2 = Person.new("Taro", 30) puts person2.name # Taro puts person2.age # 30 |
実行結果は以下のようになります
1 2 |
Taro 30 |
コンストラクタを複数定義してもエラーにはなりませんが、最後のコンストラクタのみが有効になります。
そのため、person1 = Person.new(“Taro”)を実行すると、ArgumentErrorが発生します。このように、コンストラクタはオーバーロードできません。
6:コンストラクタのオーバーライド
Rubyでは、クラスを継承して、コンストラクタをオーバーライドできます。つまり、サブクラスで必要に応じて再定義できるということです。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
class Person # コンストラクタ def initialize(name, age) @name = name @age = age end # アクセサの設定 attr_accessor :name, :age end class Student < Person # コンストラクタ def initialize(name, age, student_no) super(name, age) @student_no = student_no end # アクセサの設定 attr_accessor :student_no end person = Person.new("Taro", 30) puts person.name # Taro puts person.age # 30 student = Student.new("Hanako", 20, 123456) puts student.name # Hanako puts student.age # 20 puts student.student_no # 123456 |
実行結果は以下のようになります。
1 2 3 4 5 |
Taro 30 Hanako 20 123456 |
サブクラスのコンストラクタからスーパークラスのコンストラクタをsuperメソッドで呼び出しています。
サブクラスでは、新たにインスタンス変数student_noを追加しています。このように、クラスを継承して、コンストラクタをオーバーライドできます。
7:親クラスと子クラスの関係性を理解する
Ruby on Railsにおいて、superメソッドを利用することで親クラスの引数を子クラスに全部自動的に呼び出します。
例えば、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Human def wake puts "起きた" end end class Programmer < Human def wake super puts "しかしまだ寝足りない" end end programmer = Programmer.new programmer.wake |
こちらのコードを実行すると、
1 2 |
起きた しかしまだ寝足りない |
となります。
Railsでのinitializeを使ったサンプルコード
実際にRailsにおいてHumanクラスを作成して名前を設定するコードは、
1 2 3 4 5 |
class Human def initialize() # ここに処理を書く end end |
このようなコードになります。実際に書いてみると、
1 2 3 4 5 6 7 8 9 10 11 12 |
class Human def initialize(name) @name = name end def hello @name + "がいます" end end human = Human.new('私').hello p human |
このコードを実行すると「私がいます」と出力されます。
- システム
エンジニア - Rubyにはコンストラクタであるinitializeメソッドが用意されているのですね。
- プロジェクト
マネージャー - 実際にソースコードを自分で書いてみると、もっと理解が深まりますよ。
Rubyのソースコードを書いてみよう
Rubyにはコンストラクタであるinitializeメソッドが用意されています。基本的に、初期化処理はコンストラクタで行います。
また、クラスを継承して、コンストラクタをオーバーライドできます。ぜひご自身でRubyのソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


Ruby新着案件New Job
RedmineプラグインおよびWEB開発/Ruby/東京都中央区/【WEB面談可】/在宅勤務
月給65万~65万円東京都中央区(新富町駅)Webアプリケーション運用保守/Ruby/東京都江東区/【WEB面談可】
月給50万~60万円東京都江東区(亀戸駅)Webアプリケーション開発(既存機能改修)のテスター/Ruby/東京都江東区/【WEB面談可】
月給25万~35万円東京都江東区(亀戸駅)Webアプリケーション開発(既存機能改修)/Ruby/東京都江東区/【WEB面談可】
月給45万~60万円東京都江東区(亀戸駅)Ansibelの自動構築/Ruby/東京都台東区/【WEB面談可】/テレワーク
月給46万~48万円東京都台東区(浅草駅)会計ワークフローの開発/Ruby/東京都新宿区/【WEB面談可】/フルリモート
月給46万~48万円東京都新宿区(新宿駅)