Los métodos attr_* de Ruby

En esta página:
En Programación Orientada a Objetos el concepto de Member Access Control es importante, ya que permite controlar el acceso a variables encapsuladas, en muchos lenguajes de programación el concepto de Member Access Control se implementa utilizando getters y setters para cada miembro y en Ruby los métodos attr_* son los que están a cargo de Member Access Control y en este Post hablaremos sobre ello.
Antes de continuar con este Post, te invito a escuchar el Podcast: “Donde buscar ayuda sobre Programación”:
Spotify:
Sound Cloud:
Bien ahora continuemos con el Post: Atributos en Ruby.
Vamos a mencionar el nombre del método attr_* con una descripción y código de ejemplo para entenderlo mejor.
attr
Este método crea una variable de instancia y un método getter para cada nombre de atributo que es pasado como argumento.
Un argumento puede ser un Symbol o un String que se convertirá a Symbol.
1 2 3 4 5 6 7 |
module Attr attr :attr1, 'attr2' end irb> Attr.instance_methods => [:attr1, :attr2] |
En el código anterior, el módulo Attr incluye 2 métodos de instancia que permiten leer el valor de attr1 y attr2.
attr_reader
El método attr_reader es similar al anterior, es decir al método attr
1 2 3 4 5 6 7 |
module Attr attr_reader :attr1, 'attr2' end irb> Attr.instance_methods => [:attr1, :attr2] |
attr_writer
Este método crea una variable de instancia y un método que es establecido en cada nombre de atributo que sea pasado como argumento.
Un argumento puede ser un Symbol o un String que se convertirá a Symbol
1 2 3 4 5 6 7 |
module Attr attr_writer :attr1, 'attr2' end irb> Attr.instance_methods => [:attr1=, :attr2=] |
En el código anterior, el módulo Attr incluye 2 métodos de instancia que permiten modificar el valor de attr1 y attr2.
attr_accesor
Este método crea un variable de instancia, un método getter y setter para cada nombre de atributo que es pasado como argumento.
Un argumento puede ser un Symbol o un String que se convertirá a Symbol.
1 2 3 4 5 6 7 |
module Attr attr_accessor :attr1, 'attr2' end irb> Attr.instance_methods.sort => [:attr1, :attr1=, :attr2, :attr2=] |
En el código anterior, el módulo Attr incluye 4 métodos de instancia que permiten leer y modificar el valor de attr1 y attr2.
Mecanismo Lazy initialization
En los métodos anteriores, mencione que los métodos attr_* crean variables de instancia.
Las variables de instancia creadas por los métodos attr_* usan el mecanismo lazy initialization.
Esto significa que las variables de instancia solo se inicializan cuando se invoca el método setter o cuando la variable de instancia se establece explícitamente dentro de un método de instancia.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class paginaWeb attr_accessor :link, :title def initialize @title = "Nube Colectiva" end end irb> website = Website.new => #<Website:0x00777 @title="Nube Colectiva"> irb> website.instance_variables => [:@title] irb> website.link = "https://nubecolectiva.com" => "https://nubecolectiva.com" irb> website.instance_variables [:@title, :@link] |
En el código anterior la variable de instancia @title se crea explícitamente en el método paginaWeb#initialize.
Por lo tanto, la variable de instancia @title esta disponible en el array devuelto por la primera llamada a instance_variables.
Observa que la variable de instancia @link aún no se ha creado, a pesar de la llamada al método attr_accessor. Esta variable de instancia @link solo se crea después de la llamada al método paginaWeb#link.
Conclusión
Al usar lo métodos attr_*, una variable de instancia asociada a cada nombre de argumento solo se creará cuando le establezcamos un valor (al usar el método setter o al asignarle un valor explícitamente).
Nota(s)
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en las Redes Sociales para que no te pierdas nuestros próximos contenidos.
Social
Redes Sociales (Developers)
Redes Sociales (Digital)