115
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【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_writer: 変数名 更新を可能にする。(「セッター」と同じ役割)
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'
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
115
Help us understand the problem. What are the problem?