Você pode usar os diferentes acessadores para comunicar sua intenção a alguém que está lendo seu código e facilitar a gravação de classes que funcionarão corretamente, independentemente de como a API pública seja chamada.
class Person
attr_accessor :age
...
end
Aqui, vejo que posso ler e escrever a era.
class Person
attr_reader :age
...
end
Aqui, vejo que só posso ler a idade. Imagine que ele é definido pelo construtor dessa classe e depois disso permanece constante. Se houvesse um mutador (escritor) para a idade e a classe fosse escrita assumindo que a idade, uma vez definida, não muda, um bug pode resultar do código que chama esse mutador.
Mas o que está acontecendo nos bastidores?
Se você escrever:
attr_writer :age
Isso é traduzido para:
def age=(value)
@age = value
end
Se você escrever:
attr_reader :age
Isso é traduzido para:
def age
@age
end
Se você escrever:
attr_accessor :age
Isso é traduzido para:
def age=(value)
@age = value
end
def age
@age
end
Sabendo disso, eis outra maneira de pensar sobre isso: Se você não tivesse os auxiliares de atributos e tivesse que escrever os acessadores por si mesmo, escreveria mais acessadores do que a sua classe precisava? Por exemplo, se a idade apenas precisasse ser lida, você também escreveria um método que permitisse que ela fosse escrita?