Sto avendo difficoltà a capire attr_accessor
in Ruby. Qualcuno può spiegarmelo?
attr_accessor è solo un metodo. (Il link dovrebbe fornire maggiori informazioni su come funziona - guardate le coppie di metodi generati, e un tutorial dovrebbe mostrarvi come usarlo).
Il trucco è che class
non è una definizione in Ruby (è "solo una definizione" in linguaggi come C++ e Java), ma è una espressione che valuta. È durante questa valutazione che viene invocato il metodo attr_accessor
che a sua volta modifica la classe corrente - ricordate il destinatario implicito: self.attr_accessor
, dove self
è l'oggetto classe "aperto" a questo punto.
La necessità di attr_accessor
e dei suoi amici è, beh:
Ruby, come Smalltalk, non permette l'accesso alle variabili di istanza al di fuori dei metodi1 per quell'oggetto. Cioè, le variabili di istanza non possono essere accessibili nella forma x.y
come è comune in Java o anche in Python. In Ruby y
è sempre preso come un messaggio da inviare (o "metodo da chiamare"). Quindi i metodi attr_*
creano dei wrapper che delegano l'accesso alle @variabili
dell'istanza attraverso metodi creati dinamicamente.
Boilerplate fa schifo
Spero che questo chiarisca alcuni dei piccoli dettagli. Buona codifica.
1/sup> Questo non è strettamente vero e ci sono alcune "tecniche" intorno a questo, ma non c'è supporto sintattico per "variabile pubblica di istanza" accesso.