#結論
attr_readerを用いるとアトリビュートを読み取るメソッドが定義される。
attr_writerを用いるとアトリビュートを書き込むメソッドが定義される。
attr_accessorを用いるとアトリビュートを読み取るメソッドと書き込むメソッドの両方が定義される。
##公式リファレンス
attr_reader
https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_reader.html
attr_writer
https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_writer.html
attr_accessor
https://docs.ruby-lang.org/ja/latest/method/Module/i/attr_accessor.html
#attr_reader
class User
attr_reader :id, :name
def initialize(id, name)
@id = id
@name = name
end
end
この表記で以下のメソッドが定義されます。
def id
@id
end
def name
@name
end
これによりインスタンスを作成した後、アトリビュートを以下のように読み取ることができます。
user = User.new(1, 'kot')
=> #<User:0x00007fd644997218 @name="kot", @id=1>
user.id
=> 1
user.name
=> "kot"
#attr_writer
class User
attr_writer :id, :name
def initialize(id, name)
@id = id
@name = name
end
end
この表記で以下のメソッドが定義されます。
def id=(id)
@id = id
end
def name=(name)
@name = name
end
これによりインスタンスを作成した後、アトリビュートを書き込むことができます。
user = User.new(1, 'kot')
=> #<User:0x00007fa0678aaea8 @id=1, @name="kot">
user.name = 'kotkot'
=> "kotkot"
読み取りはできないので以下のように両者(attr_reader, attr_writer)を表記することで読み取りと書き込みができるようになります。
class User
attr_reader :id, :name
attr_writer :id, :name
def initialize(id, name)
@id = id
@name = name
end
end
user = User.new(1, 'kot')
=> #<User:0x00007fa0678aaea8 @id=1, @name="kot">
user.name
=> "kot"
user.name = 'kotkot'
=> "kotkot"
#attr_accessor
attr_readerやattr_writerを記述するだけで以下のように簡単にメソッドが定義されます。
def hoge
@hoge
end
def hoge=(hoge)
@hoge = hoge
end
しかし両方を用いること場合にはattr_accessorを用いることでさらに簡単にメソッド定義できます。
class User
attr_accessor :id, :name
def initialize(id, name)
@id = id
@name = name
end
end
#補足
各アトリビュートの読み取りメソッドが定義されるので以下のようにnameメソッドを他のメソッド内で用いることもできます。
class User
attr_accessor :name
def initialize(name)
@name = name
end
def greet
"Hello #{name}"
end
end
user = User.new('kot')
=> #<User:0x00007fa0648e9d18 @name="kot">
user.greet
=> "Hello kot"
#おわりに
学び始めたときはなんとなくで書いていましたが、それぞれのメソッドが何をしているのかを公式リファレンス見ながら一つずつ理解することが定着への近道だと改めて感じました。