ruby - attr_reader - attr vs attr_accessor
getter setter ruby (3)
En Ruby 1.8, attr
puede definir un solo atributo, con un true
opcional para crear un definidor. En 1.9 se comporta como attr_reader
: permite múltiples atributos. Como dice @Linuxios, el booleano opcional está en desuso.
En Ruby hay cuatro métodos diferentes de obtención y establecimiento para variables de instancia, attr
, attr_reader
, attr_writer
y attr_accessor
. La pregunta es, ¿está en Ruby attr :dilithium
, lo mismo que attr_reader :dilithium
, e idéntico a attr_accessor :dilithium
si se pasa un parámetro adicional true? Es decir, es
class Enterprise
attr :dilithium, true
idéntico a
class Enterprise
attr_accessor :dilithium
¿Son las dos funciones attr
y attr_accessor
más o menos redundantes?
Si observa el código C en Ruby 2.3.0, verá que attr
y attr_reader
realidad están haciendo lo mismo (a excepción de la ruta del código en desuso). Son funciones esencialmente equivalentes.
Para mí, las principales diferencias son:
attr
es un poco más fácil de escribir ya que es más corto. También me gusta la forma en que se siente en el contexto de la programación funcional / inmutable (en esos contextos, attr_writer
y attr_accessor
son irrelevantes y, por lo tanto, usar attr_reader
siente detallado y redundante).
attr
con múltiples variables de instancia hace que sea difícil de documentar, excepto en situaciones muy específicas, por ejemplo,
# The coordinates in WGS84.
attr :x, :y
# The location name.
attr :name
# The popularity of the location.
attr :popularity
Sería más difícil documentar :name
y :popularity
independientemente si estuvieran en la misma línea attr :name, :popularity
.
Aparte de eso se reduce a las preferencias personales. No hay en la práctica diferencia de rendimiento o cualquier otra diferencia.
Una diferencia es que attr_accessor
y los amigos son más claros, y el argumento booleano opcional para attr
ahora está en deprecated . Aparte de eso, y el hecho de que attr
no tiene documentación, no hay una diferencia real.