Hemos visto como definimos atributos en una clase anteponiendo el caracter @:
class Persona
def initialize(nombre)
@nombre = nombre
end
Los atributos son independientes por cada objeto o instancia de la clase (también se las llama variables de instancia), es decir si definimos tres objetos de la clase Persona, todas las personas tienen un atributo @nombre pero cada uno tiene un valor independiente:
class Persona
attr_accessor :nombre
def initialize(nombre)
@nombre = nombre
end
end
# bloque principal
persona1 = Persona.new "Juan"
persona2 = Persona.new "Ana"
persona3 = Persona.new "Luis"
puts persona1.nombre # Juan
puts persona2.nombre # Ana
puts persona3.nombre # Luis
En algunas situaciones necesitamos almacenar datos que sean compartidos por todos los objetos de dicha clase, en esas situaciones debemos emplear variables de clase.
Para definir una variable de clase lo hacemos dentro de la clase pero fuera de sus métodos antecediendo a la variable los caracteres @@:
class Persona
@@variable = 20
attr_accessor :nombre
def initialize(nombre)
@nombre = nombre
end
def variable
@@variable
end
def variable=(valor)
@@variable = valor
end
end
# bloque principal
persona1 = Persona.new "Juan"
persona2 = Persona.new "Ana"
persona3 = Persona.new "Luis"
puts persona1.nombre # Juan
puts persona2.nombre # Ana
puts persona3.nombre # Luis
puts persona1.variable # 20
persona2.variable = 50
puts persona1.variable # 50
Se reserva solo un espacio para la variable @@variable, independientemente que se definan muchos objetos de la clase Persona. La variable @@variable es compartida por todos los objetos persona1, persona2 y persona3.
Si mostramos el contenido de @@variable a partir del objeto persona1:
puts persona1.variable # 20
Luego modificamos la variable de clase @@variable a partir del objeto persona2:
persona2.variable = 50
Si mostramos ahora el contenido de la variable de la clase accediendo a partir de cualquiera de los tres objetos el valor es el mismo:
puts persona1.variable # 50
Definir una clase Cliente que almacene un código de cliente y un nombre.
En la clase Cliente definir una variable de clase de tipo Array que almacene todos los clientes que tienen suspendidas sus cuentas corrientes.
Imprimir por pantalla todos los datos de clientes y el estado que se encuentra su cuenta corriente.
class Cliente
@@suspendidos = []
def initialize(codigo, nombre)
@codigo = codigo
@nombre = nombre
end
def imprimir
puts "Codigo: #{@codigo}"
puts "Nombre: #{@nombre}"
esta_suspendido
end
def esta_suspendido
if @@suspendidos.include? @codigo
puts "Esta suspendido"
else
puts "No esta suspendido"
end
puts "*" * 50
end
def suspender
@@suspendidos << @codigo
end
end
# bloque principal
cliente1 = Cliente.new 1, "Juan"
cliente2 = Cliente.new 2, "Ana"
cliente3 = Cliente.new 3, "Diego"
cliente4 = Cliente.new 4, "Pedro"
cliente3.suspender
cliente4.suspender
cliente1.imprimir
cliente2.imprimir
cliente3.imprimir
cliente4.imprimir
La clase Cliente define una variable de clase llamada @@suspendidos que es de tipo Array y por ser variable de clase es compartida por todos los objetos que definamos de dicha clase:
class Cliente @@suspendidos = []
En el método imprimir mostramos el código, nombre del cliente y si se encuentra suspendida su cuenta corriente:
def imprimir
puts "Codigo: #{@codigo}"
puts "Nombre: #{@nombre}"
esta_suspendido
end
El método suspender lo que hace es agregar el código de dicho cliente al Array de clientes suspendidos:
def suspender
@@suspendidos << @codigo
end
El método que analiza si está suspendido el cliente verifica si su codigo se encuentra almacenado en la variable de clase suspendidos:
def esta_suspendido
if @@suspendidos.include? @codigo
puts "Esta suspendido"
else
puts "No esta suspendido"
end
puts "*" * 50
end
Para probar esta clase en el bloque principal creamos cuatro objetos de la clase Cliente:
# bloque principal cliente1 = Cliente.new 1, "Juan" cliente2 = Cliente.new 2, "Ana" cliente3 = Cliente.new 3, "Diego" cliente4 = Cliente.new 4, "Pedro"
Suspendemos dos clientes:
cliente3.suspender cliente4.suspender
Y luego imprimimos los datos de cada cliente:
cliente1.imprimir cliente2.imprimir cliente3.imprimir cliente4.imprimir
Es importante remarcar que todos los objetos acceden a una único Array llamado @@suspendidos gracias a que se definió como variable de clase.
ejercicio152.rb
class Jugador
@@tiempo = 30
def initialize(nombre, puntaje)
@nombre = nombre
@puntaje = puntaje
end
def imprimir
puts "Nombre: #{@nombre}"
puts "Puntaje: #{@puntaje}"
puts "Fin de juego en #{@@tiempo} minutos"
end
def pasar_minuto
@@tiempo = @@tiempo - 1
end
def tiempo
@@tiempo
end
end
# bloque principal
jugador1 = Jugador.new "Juan", 100
jugador2 = Jugador.new "Ana", 50
while jugador1.tiempo > 0
jugador1.imprimir
jugador2.imprimir
jugador1.pasar_minuto
end