Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Eleкtro en 22 Febrero 2012, 05:24 am



Título: [Ruby] Modificar variable de un objeto dentro de una clase
Publicado por: Eleкtro en 22 Febrero 2012, 05:24 am
Citar
En Ruby, puedes volver a abrir una clase y modificarla.

Código
  1. class Anfitrion
  2.   attr_accessor :nombre
  3. end

Se supone que eso da acceso a la variable "nombre" dentro de la clase "Anfitrion", Bien, Lo que no explica es luego como poder modificar la variable, ¿Se hace como con una variable de instancia?

Para modificar una variable de instancia es así, verdad?:
Código
  1. @nombre = "lo que sea"

?

Muxas Gracias..


Título: Re: [Ruby] Modificar variable de un objeto dentro de una clase
Publicado por: RyogiShiki en 23 Febrero 2012, 03:26 am
Cierto, es como dices, con el arroba prefijado.

Una vez tienes attr_accesor puedes acceder a la variable a através de la creación de una nueva clase. Por ejemplo supongamos que tengo esta clase:

Código
  1. class Rectangulo
  2. attr_accessor :base, :altura
  3. end

Para modificar los atributos (como se le llama a una variable propia de una clase) simplemente se instancia (crea) un nuevo objeto de dicha clase para obtener acceso a dichos atributos de la siguiente forma:

Código
  1. rect = Rectangulo.new
  2.  
  3. rect.base = 2
  4. rect.altura = 4
  5.  
  6. puts "Base: #{rect.base}, Altura:  #{rect.altura}""

también se pueden usar attr_reader, o attr_writer dependiendo si es una variable que solo se puede leer o solo se puede escribir.

Podemos también definir un método de la siguiente manera y obtener un valor de el:

Código
  1. class Rectangulo
  2. attr_accessor :base, :altura, :area
  3.  
  4. def area
  5. @area = @base * @altura
  6. end
  7. end
  8.  
  9. rect = Rectangulo.new
  10.  
  11. rect.base = 2
  12. rect.altura = 4
  13.  
  14. puts "Base: #{rect.base}, Altura:  #{rect.altura}"
  15. puts rect.area
  16.  

Podemos agregar un inicializador (no confundir con constructor, este no es un constructor, porque estrictamente no construye el objeto, solo le da valores a los atributos) como el siguiente (un inicializador siempre se debe escribir con initialize):

Código
  1. class Rectangulo
  2. attr_accessor :base, :altura, :area
  3.  
  4. def initialize(base, altura)
  5. @base = base
  6. @altura = altura
  7. end
  8.  
  9. def area
  10. @area = @base * @altura
  11. end
  12. end

Lo que nos permite entonces inicializar los atributos del objeto en el momento de su instanciación, entonces de la siguiente manera podremos crear un nuevo objeto de tipo rectangulo:

Código
  1. class Rectangulo
  2. attr_accessor :base, :altura, :area
  3.  
  4. def initialize(base, altura)
  5. @base = base
  6. @altura = altura
  7. end
  8.  
  9. def area
  10. @area = @base * @altura
  11. end
  12. end
  13.  
  14. rect = Rectangulo.new(2, 4)
  15.  
  16.  
  17. puts "Base: #{rect.base}, Altura: #{rect.altura}"
  18. puts rect.area
  19.  

Verás que de esta forma si intentas crear el objeto sin mandarle valores para que asigne a sus atributos así:

Código
  1. rect= Rectangulo.new

Lanzará un error de argumentos insuficientes. Lo que está genial porque en el método area ya no tendremos que preocuparnos si los valores de la base y la altura están inicializados para poder realizar la operación.

Saludos.


Título: Re: [Ruby] Modificar variable de un objeto dentro de una clase
Publicado por: Eleкtro en 23 Febrero 2012, 10:52 am
No creo que pudiera hacer eso sin tus ejemplos
En resumen, me queda mucho que aprender XDDD

mil gracias