Вы можете использовать различные средства доступа, чтобы сообщить о своем намерении кому-то, читающему ваш код, и упростить написание классов, которые будут работать правильно, независимо от того, как вызывается их публичный API.
class Person
attr_accessor :age
...
end
Здесь я вижу, что могу читать и писать возраст.
class Person
attr_reader :age
...
end
Здесь я вижу, что могу читать только возраст. Представьте, что он установлен конструктором этого класса и после этого остается постоянным. Если для возраста существовал мутатор (писатель), а класс был написан, предполагая, что установленный возраст не изменится, то в результате вызова кода этим мутатором может возникнуть ошибка.
Но что происходит за кулисами?
Если вы напишите:
attr_writer :age
Это переводится на:
def age=(value)
@age = value
end
Если вы напишите:
attr_reader :age
Это переводится на:
def age
@age
end
Если вы напишите:
attr_accessor :age
Это переводится на:
def age=(value)
@age = value
end
def age
@age
end
Зная это, вот еще один способ подумать об этом: если бы у вас не было помощников attr _..., и вы должны были написать аксессоры самостоятельно, вы бы написали больше аксессоров, чем требовалось вашему классу? Например, если нужно только прочитать возраст, вы бы также написали метод, позволяющий записать его?