今回はアクセサメソッドについて解説します。
アクセサメソッドを説明するには、インスタンスメソッドや、インスタンス変数のことを知らなければ理解するのが難しいと思うので、順をおって説明していきます。
目次
アクセサメソッドを簡単に説明すると
アクセサメソッドを簡単に説明すると「インスタンスメソッドをわざわざ書かなくても、簡単にインスタンス変数の値を参照することができるメソッド」のことです。
インスタンス変数はクラスの外部から参照することができないため、アクセサメソッドを使用して、インスタンス変数を参照できるようにします。
インスタンス変数とは
インスタンス変数とは、クラス内の「@」が付いた変数です。(下のコードで説明すると、「@name」)
インスタンス変数はインスタンスごとに異なる値を割り当てることができます。
# クラス class Student # インスタンス生成時に実行される def initialize(name) @name = name end end # インスタンスの生成 (名前を引数で渡す) student1 = Student.new('山田太郎') student2 = Student.new('山田花子')
同じクラスを使用してインスタンスを生成しても、「student1」と「student2」の「@name」には違う名前が代入されています。
このように、インスタンス変数には、インスタンスによって別の値を代入することができます。
インスタンスメソッドとは
インスタンスメソッドとは、ここでは「インスタンス変数を読み書きするメソッド」のことです。
(※厳密には少し違いますが、アクセサメソッドの説明をするために、ここではこのように説明させていただきます)
インスタンス変数を取得するインスタンスメソッド(ゲッター)
インスタンス変数を取得するインスタンスメソッドを「ゲッター」と呼びます。
ダメなコードと良いコードを両方載せますので、比較して、理解できるようにしています。
エラーになる例
# クラス class Student # インスタンス生成時に実行される def initialize(name) @name = name end end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # インスタンス変数を参照して、名前を確認したい puts student.@name #インスタンス変数は参照できないため、エラーになる
「@name」をクラスの外部から直接参照しようしているため、エラーになります。
良い例
# クラス class Student # インスタンス生成時に実行される def initialize(name) @name = name end # @nameを取得するメソッド(ゲッター) def name @name end end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # 取得した名前の確認をする puts student.name
このコードでは、「@nameを取得するメソッド」を新しく追加することで、正常に名前が表示されます。
インスタンス変数を参照するのではなく、メソッドを呼び出すことで、先ほどのエラーを解決しました。
インスタンス変数を更新するインスタンスメソッド(セッター)
インスタンス変数を更新するインスタンスメソッドを「セッター」と呼びます。
こちらダメなコードと良いコードを例に説明します
エラーになる例
# クラス class Student # インスタンス生成時に実行される def initialize(name) @name = name end # @nameを取得するメソッド(ゲッター) def name @name end end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # 取得した名前の確認をする puts student.name # 名前を変更したい student.@name = '山田武' #インスタンス変数は参照できないため、エラーになる
こちらも「@name」を直接更新しようとしているため、エラーになります。
良い例
# クラス class Student # インスタンス生成時に実行される def initialize(name) @name = name end # @nameを取得するメソッド(ゲッター) def name @name end # 名前を変更するメソッド(セッター) def name=(value) @name = value end end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # 取得した名前の確認をする puts student.name # 名前を変更したい student.name = '山田武' # 変更できたか確認する puts student.name
このコードでは、「@nameを更新するメソッド」を新しく追加することで、「@name」の変更がエラーなく、実行できます。
アクセサメソッドとは
アクセサメソッドは、先ほど紹介したような「インスタンスメソッドをわざわざ書かなくても、インスタンス変数に参照できる」ようにします。
アクセサメソッドは3つあります。
- attr_accessor
- attr_reader
- attr_writer
attr_accessor
# クラス class Student attr_accessor :name # インスタンス生成時に実行される def initialize(name) @name = name end #----------------------------------------- #この処理を書かなくてもいい # # @nameを取得するメソッド(ゲッター) # def name # @name # end # # 名前を変更するメソッド(セッター) # def name=(value) # @name = value # end #------------------------------------------ end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # 取得した名前の確認をする puts student.name # 名前を変更したい student.name = '山田武' # 変更できたか確認する puts student.name
「attr_accessor」を使えば、インスタンスメソッドを書かなくても、一行でゲッターとセッターの役割をしてくれます。
ゲッターとセッターをコメントアウトしても、正常に処理されます。
attr_reader
# クラス class Student attr_reader :name # インスタンス生成時に実行される def initialize(name) @name = name end #----------------------------------------- #ゲッターのみコメント # # @nameを取得するメソッド(ゲッター) # def name # @name # end # # 名前を変更するメソッド(セッター) def name=(value) @name = value end #------------------------------------------ end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # 取得した名前の確認をする puts student.name # 名前を変更したい student.name = '山田武' # 変更できたか確認する puts student.name
「attr_reader」を使えば、ゲッターと同じ役割をしてくれます。
ゲッターの部分をコメントアウトしても、正常に処理されます。
attr_writer
# クラス class Student attr_writer :name # インスタンス生成時に実行される def initialize(name) @name = name end #----------------------------------------- #セッターのみコメント # # @nameを取得するメソッド(ゲッター) def name @name end # # 名前を変更するメソッド(セッター) # def name=(value) # @name = value # end #------------------------------------------ end # インスタンスの生成 (名前を引数で渡す) student = Student.new('山田太郎') # 取得した名前の確認をする puts student.name # 名前を変更したい student.name = '山田武' # 変更できたか確認する puts student.name
「attr_writer」を使えば、ゲッターと同じ役割をしてくれます。
セッターの部分をコメントアウトしても、正常に処理されます。
アクセサメソッドのまとめ
attr_accessor | ゲッターとセッターの役割 |
attr_reader | ゲッターの役割 |
attr_writer | セッターの役割 |
アクセサメソッドはインスタンスメソッド書く手間を省略してくれる便利なメソッドになります。
もし使う機会があれば、活用することで、作業効率の向上に繋がります。