Ruby

【Ruby】「ゲッター」と「セッター」を理解する


概要

Rubyの「ゲッター」・「セッター」とは何か?

また同じ動作をより簡単に行うアクセスメソッドについてまとめました。


「ゲッター」とは?

インスタンス変数をクラス内から参照するメソッドが「ゲッター」です。

本来Rubyではインスタンス変数の値はクラス内からしか取得出来ません。

そこで、それを可能にする為にクラス内にインスタンス変数を参照する専用のメソッド「ゲッター」を定義します。

例えば、通常では以下のMovieクラスからインスタンス変数の直接的な参照はできません。

class Movie

def initialize(name)
@name = name
end
end

obj1 = Movie.new('Forrest Gump')

p obj1.name #=>undefined method `name' for #<Movie:0x00007fd4558526f0 @name="Forrest Gump">

これを参照するためにはクラス内にインスタンス変数を参照するメソッド「ゲッター」を定義する必要があります。以下の例ではメソッドMovie#getName「ゲッター」です。

これでインスタンス変数をクラス外で参照することができます。

class Movie

def initialize(name)
@name = name
end

def getName #「ゲッター」
@name
end
end

obj1 = Movie.new('Forrest Gump')

p obj1.getName #=> 'Forrest Gump'


「セッター」とは?

インスタンス変数をクラス内で更新するメソッドが「セッター」です。

参照同様、インスタンス変数の更新もクラス内でしかできません。

そこで、それを可能にする為にクラス内にインスタンス変数の内容を更新する専用のメソッド「セッター」を定義します。

例えば、通常では以下のMovieクラスからインスタンス変数の直接的な変更はできません。

class Movie

def initialize(name)
@name = name
end
end

obj1 = Movie.new('Forrest Gump')

p obj1.name = 'Fight Club' #=>undefined method `name=' for #<Movie:0x00007ffd4a83b400 @name="Forrest Gump"> (NoMethodError)

このような更新を実行するためにはクラス内にインスタンス変数を更新するメソッド「セッター」を定義する必要があります。以下の例ではメソッドMovie#changeName「セッター」です。

これでインスタンス変数をクラス外で更新することができます。

class Movie

def initialize(name)
@name = name
end

def getName #「ゲッター」
@name
end

def changeName=(name) #「セッター」
@name = name
end
end

obj1 = Movie.new('Forrest Gump')
obj1.changeName = 'Fight Club'
p obj1.getName #=> 'Fight Club'


アクセスメソッドとは?

「アクセスメソッド」とは上記の「ゲッター」「セッター」を定義せずともインスタンス変数の参照・更新を可能にする方法です。

3種類の「アクセスメソッド」が存在します。

定義式
機能

attr_reader: 変数名
参照を可能にする。(「ゲッター」と同じ役割)

attr_writter: 変数名
更新を可能にする。(「セッター」と同じ役割)

attr_accessor: 変数名
参照・更新の両方を可能にする。(「セッター」「ゲッター」と同じ役割)

例えばクラス内に「attr_reader」を追加することで「ゲッター」と同じ役割を果たします。(インスタンス変数のクラス外からの参照を可能にする。)

class Movie

attr_reader :name

def initialize(name)
@name = name
end
end

obj1 = Movie.new('Forrest Gump')
p obj1.name #=> 'Forrest Gump'

またクラス内に「attr_writer」を追加することで「セッター」と同じ役割を果たします。(インスタンス変数のクラス外からの更新を可能にする。)

class Movie

attr_reader :name
attr_writer :name
def initialize(name)
@name = name
end
end

obj1 = Movie.new('Forrest Gump')
obj1.name = 'Fight Club'
p obj1.name #=> 'Fight Club'

また、「attr_accessor 」を追加することで「セッター」「ゲッター」両方の役割を果たします(インスタンス変数のクラス外からの参照・更新を可能にする。)。

class Movie

attr_accessor :name
def initialize(name)
@name = name
end
end

obj1 = Movie.new('Forrest Gump')
obj1.name = 'Fight Club'
p obj1.name #=> 'Fight Club'