È possibile utilizzare i diversi accessori per comunicare le proprie intenzioni a qualcuno che legge il proprio codice e semplificare la scrittura di classi che funzioneranno correttamente, indipendentemente da come viene chiamata la loro API pubblica.
class Person
attr_accessor :age
...
end
Qui, posso vedere che posso sia leggere che scrivere l'età.
class Person
attr_reader :age
...
end
Qui, posso vedere che posso solo leggere l'età. Immagina che sia impostato dal costruttore di questa classe e che successivamente rimanga costante. Se ci fosse un mutatore (scrittore) per età e la classe fosse scritta supponendo che l'età, una volta impostata, non cambi, allora potrebbe derivare un errore dal codice che chiama quel mutatore.
Ma cosa sta succedendo dietro le quinte?
Se scrivi:
attr_writer :age
Questo viene tradotto in:
def age=(value)
@age = value
end
Se scrivi:
attr_reader :age
Questo viene tradotto in:
def age
@age
end
Se scrivi:
attr_accessor :age
Questo viene tradotto in:
def age=(value)
@age = value
end
def age
@age
end
Sapendo questo, ecco un altro modo di pensarci: se non avessi gli helper attr _... e dovessi scrivere tu stesso gli accessor, scriveresti più accessori di quelli necessari alla tua classe? Ad esempio, se l'età avesse solo bisogno di essere letta, scriveresti anche un metodo che consente di scriverlo?