Możesz użyć różnych akcesoriów, aby przekazać swoją intencję komuś, kto czyta Twój kod, i ułatwić pisanie klas, które będą działać poprawnie bez względu na to, jak wywoływany jest ich publiczny interfejs API.
class Person
attr_accessor :age
...
end
Widzę tutaj, że mogę zarówno czytać, jak i pisać wiek.
class Person
attr_reader :age
...
end
Widzę tutaj, że mogę tylko odczytać wiek. Wyobraź sobie, że jest ustawiony przez konstruktora tej klasy, a potem pozostaje stały. Gdyby istniał mutator (pisarz) dla wieku, a klasa została napisana przy założeniu, że ustawiony wiek nie zmienia się, wówczas błąd mógłby wynikać z wywołania kodu przez tego mutatora.
Ale co dzieje się za kulisami?
Jeśli napiszesz:
attr_writer :age
To przekłada się na:
def age=(value)
@age = value
end
Jeśli napiszesz:
attr_reader :age
To przekłada się na:
def age
@age
end
Jeśli napiszesz:
attr_accessor :age
To przekłada się na:
def age=(value)
@age = value
end
def age
@age
end
Wiedząc o tym, oto inny sposób, aby o tym pomyśleć: jeśli nie miałbyś pomocników ATTR _... i musiałbyś sam napisać akcesory, czy napisałbyś więcej akcesorów niż potrzebna jest klasa? Na przykład, jeśli wiek należy tylko odczytać, czy napisałbyś również metodę pozwalającą na jego zapisanie?