はじめに
この記事ではattr_reader
、attr_writer
、attr_accessor
を使用してインスタンス変数へのアクセス方法を説明し、コードを簡潔にする方法を紹介します。
attr_reader, attr_writer
Rubyのオブジェクト指向プログラミングでは、インスタンス変数へのアクセス方法が重要です。Rubyのオブジェクトメソッドは基本的に公開されていますが、データ(インスタンス変数)はプライベートです。つまり、インスタンス変数には直接アクセスできず、メソッドを通してのみアクセスできます。
例えば、次のRubyクラスを考えてみましょう:
class Person
def initialize(name)
@name = name
end
end
person = Person.new("John")
puts person.@name # エラー!
インスタンス変数@name
に直接アクセスしようとすると、エラーが発生します。そのため、外部からインスタンス変数にアクセスできるようにするには、ゲッターメソッド(getter)とセッターメソッド(setter)を定義する必要があります。ゲッターメソッドはインスタンス変数の値を読み取るためのメソッドであり、セッターメソッドは新しい値を割り当てるためのメソッドです。
class Person
def initialize(name)
@name = name
end
# ゲッター(getter)メソッド
def name
@name
end
# セッター(setter)メソッド
def name=(name)
@name = name
end
end
person = Person.new("John")
puts person.name # "John"
person.name = "Brian"
puts person.name # "Brian"
これで、name
インスタンス変数の値を読み取り、変更できるようになります。しかし、各インスタンス変数に対してこれらのメソッドを定義することは冗長になることがあります。これを簡略化するために、Rubyではattr_reader
とattr_writer
が提供されています。
class Person
# attr_readerを使用してnameのゲッターメソッドを生成
attr_reader :name
# attr_writerを使用してnameのセッターメソッドを生成
attr_writer :name
def initialize(name)
@name = name
end
end
person = Person.new("John")
puts person.name # "John"
person.name = "Brian"
puts person.name # "Brian"
これにより、attr_reader
はname
のゲッターメソッドを生成し、attr_writer
はname
のセッターメソッドを生成します。これらのメソッドを使用してインスタンス変数の値を読み取り、設定できます。
attr_accessor
attr_accessor
メソッドはゲッターを生成するattr_reader
メソッドとセッターを生成するattr_writer
メソッドを1つのメソッドに結合したメソッドです。 このメソッドを使用する場合には、あえてattr_reader
、attr_writer
をそれぞれ定義する必要はありません。attr_accessor
を使用すると、コードがより簡潔になります。
class Person
# attr_accessorを使用してnameのゲッターとセッターメソッドを生成
attr_accessor :name
def initialize(name)
@name = name
end
end
person = Person.new("John")
puts person.name # "John"
person.name = "Brian"
puts person.name # "Brian"
参考