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万円東京都新宿区(新宿駅)