0
0

More than 1 year has passed since last update.

Ruby attr_reader, attr_writer, attr_accessorについて

Last updated at Posted at 2022-01-10

結論

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"

おわりに

学び始めたときはなんとなくで書いていましたが、それぞれのメソッドが何をしているのかを公式リファレンス見ながら一つずつ理解することが定着への近道だと改めて感じました。

0
0
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
0
0