34 - Objetos: acceso a atributos de una clase (otra sintaxis)

Una de las características de Ruby es tener varias formas de hacer las mismas cosas. Para acceder a los atributos de una clase vimos en el concepto anterior que debemos definir un método que retorne el valor del atributo y otro que modifique su contenido.

Ahora veremos otra sintaxis que Ruby nos proporciona para la creación de estos métodos.

Problema 1:

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.

Programa: ejercicio141.rb

class Empleado
  
  attr_accessor :sueldo

  def initialize (nombre, sueldo)
    @nombre = nombre
    @sueldo = sueldo
  end

  def imprimir
    puts "Nombre: #{@nombre}"
    puts "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

puts Empleado.methods

Llamamos al método attr_accessor e indicamos el nombre del atributo como símbolo (es decir antecediendo el caracter :)
Luego Ruby se encarga de crear en forma transparente los dos métodos:

  def sueldo
    @sueldo
  end

  def sueldo=(sueldo)
    @sueldo = sueldo
  end

Como vemos reduce mucho el código cuando queremos acceder tanto para consultar como modificar un atributo.

Existen otros dos métodos llamados attr_reader y attr_writer.

El método attr_reader solo creará el método:

  def sueldo
    @sueldo
  end

Y si llamamos al método attr_writer solo se creará el método:

  def sueldo=(sueldo)
    @sueldo = sueldo
  end

Problema 2:

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.

Programa: ejercicio142.rb

class Dado
  
  attr_reader :nro

  def initialize
    @nro = 1
  end

  def tirar
    @nro = rand(6) + 1
  end

  def imprimir
    puts "Valor del dado #{@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 queremos que el atributo @nro solo se tenga acceso para consultar su valor y no modificar, entonces llamamos a attr_reader e indicamos el nombre del atributo (tener en cuenta que ponemos : en lugar de @):

  attr_reader :nro

Problema propuesto

  • Plantear una clase TablaMultiplicar. Definir un atributo que se le pueda indicar el valor de la tabla a mostrar, por defecto comienza en 2. Definir también un método que imprima 10 términos de la tabla.
    Utilizar attr_writer para poder modificar el atributo que almacena la tabla de multiplicar a mostrar.
Solución
ejercicio143.rb

class TablaMultiplicar
  
  attr_writer :tabla

  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

end


t = TablaMultiplicar.new
t.imprimir
t.tabla = 5
t.imprimir
t.tabla = 9
t.imprimir