search
LoginSignup
15

More than 3 years have passed since last update.

posted at

Rubyでのゲッターとセッターについて

はじめに

「ゲッターとは何か?」「セッターとは何か?」
また、それらを簡単に定義することのできる、「アクセスメソッドとは何か?」について、
私なりにまとめてみました。

ゲッターとは

通常、インスタンス変数内の値はクラス外からでは参照できません。

user.rb
class User
  def initialize(name)
    @name = name
  end
def

user = User.new("Tom") 
user.name  #=>undefined method `name' for #<User:0x00007fc5c98af3b8 @name="Tom">

これをクラス外からでもインスタンス変数内の値を参照できるようにしたメソッドのことをゲッターといいます。

user.rb
class User
  def initialize(name)
    @name = name
  end

  def name #ゲッター
    @name
  end
end

user = User.new("Tom") 
user.name  #=>"Tom"

先ほどでは参照できなかった@name内の値が、ゲッターを介すことで、参照することができているのがわかります。

セッターとは

通常、インスタンス変数内の値はクラス外からは更新ができません。

user.rb
class User
  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name = "Bob"  #=>undefined method `name=' for #<User:0x00007fdc0092f368 @name="Tom">

これをクラス外からでもインスタンス変数内の値を更新できるようにしたメソッドのことをセッターといいます。

user.rb
class User
  def initialize(name)
    @name = name
  end

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

user = User.new("Tom") 
user.name = "Bob"  #=>"Bob"

先ほどでは更新できなかった@name内の値が、セッターを介すことで、更新することができているのがわかります。

※セッターは末尾に=をつけるname=(name)

アクセスメソッドを使って、ゲッターやセッターを簡単に定義する

アクセスメソッドというものを使って、ゲッターとセッターを簡単に定義することができます。
アクセスメソッドは、3種類存在します。
* attr_reader
* attr_writer
* attr_accessor

定義式 機能
attr_reader :変数名 ゲッターと同じ役割を持つ。インスタンス変数内の値を参照する。
attr_writer :変数名 セッターと同じ役割を持つ。インスタンスな変数内の値を更新できるようにする。
attr_accessor :変数名 ゲッターとセッター両方の役割を持つ。インスタンス変数内の値を参照、更新できるようにする。

※変数名はシンボル:変数名で渡す。

attr_reader

ゲッターと同じ役割を持ち、インスタンス変数内の値を参照します。

user.rb
class User
    attr_rader :name  #ゲッター

  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name  #=>"Tom"

attr_writer

セッターと同じ役割を持ち、インスタンスな変数内の値を更新できるようにします。

user.rb
class User
    attr_writer :name  #セッター

  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name = "Bob"  #=>"Bob"

attr_accessor

ゲッターとセッター両方の役割を持ち、インスタンス変数内の値を参照、更新できるようにします。

user.rb
class User
    attr_accessor :name  #ゲッターとセッター

  def initialize(name)
    @name = name
  end
end

user = User.new("Tom") 
user.name  #=>"Tom"
user.name = "Bob"  #=>"Bob"

参考サイト / 書籍

現場で使える Ruby on Rails 5速習実践ガイド
Rubyリファレンス
【Ruby】「ゲッター」と「セッター」を理解する
アクセスメソッド

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
15