[Ruby] Modificar variable de un objeto dentro de una clase

Iniciado por Eleкtro, 22 Febrero 2012, 05:24 AM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

CitarEn Ruby, puedes volver a abrir una clase y modificarla.

Código (ruby) [Seleccionar]
class Anfitrion
   attr_accessor :nombre
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 (ruby) [Seleccionar]
@nombre = "lo que sea"

?

Muxas Gracias..








RyogiShiki

#1
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 (ruby) [Seleccionar]
class Rectangulo
attr_accessor :base, :altura
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 (ruby) [Seleccionar]
rect = Rectangulo.new

rect.base = 2
rect.altura = 4

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 (ruby) [Seleccionar]

class Rectangulo
attr_accessor :base, :altura, :area

def area
@area = @base * @altura
end
end

rect = Rectangulo.new

rect.base = 2
rect.altura = 4

puts "Base: #{rect.base}, Altura:  #{rect.altura}"
puts rect.area


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 (ruby) [Seleccionar]
class Rectangulo
attr_accessor :base, :altura, :area

def initialize(base, altura)
@base = base
@altura = altura
end

def area
@area = @base * @altura
end
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 (ruby) [Seleccionar]
class Rectangulo
attr_accessor :base, :altura, :area

def initialize(base, altura)
@base = base
@altura = altura
end

def area
@area = @base * @altura
end
end

rect = Rectangulo.new(2, 4)


puts "Base: #{rect.base}, Altura: #{rect.altura}"
puts rect.area


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

Código (ruby) [Seleccionar]
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.


Eleкtro

No creo que pudiera hacer eso sin tus ejemplos
En resumen, me queda mucho que aprender XDDD

mil gracias