attr_reader attr_accessor ruby oop

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.