Los atributos que se definen en una clase solo pueden ser accedidos dentro de los métodos de la misma clase.
Si necesitamos consultar el valor de un atributo o modificar su valor se hace a través de un método.
Confeccionar una clase que represente un empleado. Definir como atributos su nombre y su sueldo.
En el bloque principal del programa definir dos objetos de la clase Empleado e imprimir el nombre del empleado con sueldo mayor, además fijar su sueldo con el valor 1000.
class Empleado def initialize (nombre, sueldo) @nombre = nombre @sueldo = sueldo end def imprimir puts "Nombre: #{@nombre}" puts "Sueldo: #{@sueldo}" end def sueldo @sueldo end def sueldo=(sueldo) @sueldo = sueldo end end empleado1 = Empleado.new "juan", 500 empleado2 = Empleado.new "ana", 700 empleado1.imprimir empleado2.imprimir if empleado1.sueldo < empleado2.sueldo empleado1.sueldo = 1000 elsif empleado2.sueldo < empleado1.sueldo empleado2.sueldo = 1000 end puts "Luego de modificar sueldo" empleado1.imprimir empleado2.imprimir
Lo primero que hay que decir que el objeto empleado1 no puede acceder al atributo @sueldo:
if empleado1.@sueldo < empleado2.@sueldo
Esto debido que los objetos no pueden acceder a los atributos.
Para acceder al contenido de un atributo debemos definir un método que retorne su valor:
def sueldo @sueldo end
Es común definir el nombre del método con el mismo nombre del atributo sin el caracter @:
def sueldo @sueldo end
Ahora teniendo el método "sueldo" podemos acceder al atributo @sueldo:
if empleado1.sueldo < empleado2.sueldo empleado1.sueldo = 1000 elsif empleado2.sueldo < empleado1.sueldo empleado2.sueldo = 1000 end
Por otro lado tampoco podemos modificar un atributo directamente:
empleado1.@sueldo = 1000
Para poder solucionar esto definimos un método que llegue el valor a almacenar en el atributo:
def sueldo=(sueldo) @sueldo = sueldo end
Es común definir el nombre del método con el mismo nombre del atributo más el caracter =
Luego podemos cambiar el valor del atributo llamando a este método con la siguiente sintaxis:
empleado1.sueldo = 1000
Tener en cuenta que se esta llamando al método sueldo= y pasando el valor 1000.
Confeccionar una clase que represente un dado. Definir como atributo el valor del dado.
Permitir acceder al atributo solo para consultar su valor y no modificarlo.
Plantear un método llamado "tirar" que genere un valor aleatorio entre 1 y 6.
Definir dos objetos de la clase Dado y mostrar la suma de los dos dados.
class Dado def initialize @nro = 1 end def tirar @nro = rand(6) + 1 end def imprimir puts "Valor del dado #{@nro}" end def nro @nro end end dado1 = Dado.new dado2 = Dado.new dado1.tirar dado1.imprimir dado2.tirar dado2.imprimir suma = dado1.nro + dado2.nro puts "La suma de los dos dados es #{suma}"
En este problema vemos las ventajas de que los atributos sean solo accedidos dentro de la clase y no desde fuera. Hemos definido solo un método para poder acceder al valor almacenado en el atributo @nro:
def nro @nro end
Este método es indispensable para poder sumar los valores de ambos dados:
suma = dado1.nro + dado2.nro puts "La suma de los dos dados es #{suma}"
Pero no podemos cambiar el valor de @nro desde fuera de la clase:
dado1.nro = 100
Con esto nos aseguramos que si el nro del dado es incorrecto (es decir que no almacena un valor entre 1 y 6) el problema se encuentra en la misma clase Dado y no fuera.
Para generar un valor aleatorio utilizamos el método rand (si le pasamos el valor 6 luego nos retorna un valor entre 0 y 5:
def tirar @nro = rand(6) + 1 end
ejercicio140.rb class TablaMultiplicar def initialize @tabla = 2 end def imprimir puts "Tabla del #{@tabla}" for x in 1..10 valor = @tabla * x puts "#{x} * #{@tabla} = #{valor}" end puts "*" * 50 end def tabla=(valor) @tabla = valor end end t = TablaMultiplicar.new t.imprimir t.tabla = 5 t.imprimir t.tabla = 9 t.imprimir