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.