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.