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