41
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rubyのattr_accessorとは何か

Posted at

概要

Rubyでよく使用されるattr_accessorについてその必要性や使用方法などを備忘録として記載していきます。

attr_accessorとは何か

結論から言うとattr_accessor(読み方: アトリビュートアクセサー)とは、
外部からクラス内の__変数を参照するためのゲッターメソッド__とその__変数を変更するためのセッターメソッド__を定義するものです。
ゲッターメソッドとセッターメソッドについては後ほど実際の例を記載します。

  • 下記のようなUserクラスが定義されていたとします。
class User
  def initialize(name, age)
    @name = name
    @age  = age
  end
end
  • 外部から直接変数を参照した場合
# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように外部から直接参照しようとするとエラーになる
puts user.name
# もしくは
puts user.age
  • 外部から直接変数を変更した場合
# Userインスタンスを作成
user = User.new('田中', 23)
# 下記のように外部から直接変更しようとするとエラーになる
user.name = '佐藤'
# もしくは
user.age = 45

では外部から参照や変更をするにはどうすればいいのか。
そこで登場するのがattr_accessorです。

  • 先程のUserクラスを下記のように変更
class User
# attr_accessorを追加
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age  = age
  end
end

attr_accessorを追加したことにより参照、変更できるようになります。

# Userインスタンスを作成
user = User.new('鈴木', 33)
# 下記のように参照できるようになる
puts user.name #=> '鈴木'
puts user.age  #=> 33

# 下記のように変更できるようになる。
user.name = '田中'
user.age  = 56
puts user.name #=> '田中' 
puts user.age #=> 56

attr_accessorの仕組み

attr_accessorは先程もお伝えしたようにゲッターメソッドとセッターメソッドを役割があります。
具体的には下記に記載します。

  • attr_accessor :name, :age を記載しない場合
class User
  def initialize(name, age)
    @name = name
    @age  = age
  end

# ゲッターメソッド
  def name
    @name
  end
# ゲッターメソッド
  def age
    @age
  end

# セッターメソッド
  def name=(name)
    @name = name
  end
# セッターメソッド
  def age=(age)
    @age = age
  end
end

クラス内のメソッドはクラスのインスタンスから呼び出せるので

# Userインスタンス生成
user = User.new('佐藤', 55)

# Userクラス内のゲッターメソッドであるname, ageメソッドを呼び出し
puts user.name #=> '佐藤'
puts user.age  #=> 55

# Userクラス内のセッターメソッドであるname, ageメソッドを呼び出し
user.name = '吉田'
user.age  = 12
puts user.name #=> '吉田'
puts user.age  #=> 12
補足説明

name=age=のセッターメソッドは__=(イコール)をつけることで代入式として呼び出すことが可能になる。
user.name = '佐藤'user.age = 12はそれぞれ
'佐藤'と__12__を代入しているように見えるが
実際にはそれぞれ引数に
'佐藤'__と__12__を渡して、name=age=メソッドを呼び出している。


ゲッターメソッドとセッターメソッドがattr_accessorを定義することで
下記のようにコードが簡単になります。

  • attr_accessor :name, :ageを記載した場合
class User
  attr_accessor :name, :age

  def initialize(name, age)
    @name = name
    @age  = age
  end
end

attr_accessorを定義することによって上記のようにわざわざゲッターメソッドとセッターメソッドを定義しなくても
ゲッターメソッドとセッターメソッドを使用することができます。
そのおかげで、外部から変数を参照したり、変更したりできるようになっているということです。

参考文献

【Ruby】 attr_accessorメソッドの使い方と必要な理由とは?

41
24
0

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
  3. You can use dark theme
What you can do with signing up
41
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?