アクセサメソッドとは
インスタンス変数の値を読み書きするメソッドのこと。
Rubyはそのままではインスタンス変数にアクセスできない仕様になっています。
(例)
class Animal
@name = ""
end
animal = Animal.new
animal.name = "cat"
puts animal.name # => ruby.rb:6:in `<main>': undefined method `name=' for #<Animal:0x00007fce4a8b4b40> (NoMethodError)
このコードの定義方法だと、@nameは"クラスインスタンス変数"という違う変数として定義され、インスタンスからがアクセスできない仕様になっています。
インスタンスからアクセスすることのできるインスタンス変数の定義はどのようにすれば良いのか。
そこで、"アクセサメソッド"を使用します。
まず、アクセサメソッドは3種類あります。
- attr_reader
- attr_writer
- attr_accessor
attr_reader
attr_readerは、インスタンス変数にアクセスするためのゲッターです。
(例)
class Animal
attr_reader :name
def initialize(name)
@name = name
end
end
animal = Animal.new("cat")
puts animal.name # => cat
このように、attr_reader :nameと記述することで、インスタンス変数@nameにアクセスすることができます。
しかし、このままではセッターが定義されていないため、@nameをクラスの外から変更できません。
attr_writer
attr_writerは、インスタンス変数にアクセスするためのセッターです。
(例)
class Animal
attr_writer :name
attr_reader :name
def initialize(name)
@name = name
end
end
animal = Animal.new("cat")
puts animal.name
animal.name = "dog"
puts animal.name
# => cat
# dog
このように、attr_reader :nameに加え、attr_writer :nameも記述することで、外からインスタンス変数@nameを変更し、アクセスできます。
attr_accessor
attr_readerとattr_writterの機能を一つにまとめたメソッドです。
(例)
class Animal
attr_accessor :name
def initialize(name)
@name = name
end
end
animal = Animal.new("cat")
puts animal.name
animal.name = "dog"
puts animal.name
# => cat
# dog
このように外からインスタンス変数@nameを変更し、アクセスできます。