32 - Objetos: llamada de métodos desde otro método de la misma clase

Hasta ahora todos los problemas planteados hemos llamado a los métodos desde donde definimos un objeto de dicha clase, por ejemplo:

empleado1 = Empleado.new "diego", 2000
empleado1.paga_impuestos

Utilizamos la sintaxis:

[nombre del objeto].[nombre del método]

Es decir antecedemos al nombre del método el nombre del objeto y el operador punto.

Ahora bien que pasa si queremos llamar dentro de la clase a otro método que pertenece a la misma clase, la sintaxis es la siguiente:

[nombre del método]

Es importante tener en cuenta que esto solo se puede hacer cuando estamos dentro de la misma clase.

Problema 1:

Plantear una clase Operaciones que solicite en el método "initialize" la carga de dos enteros e inmediatamente muestre su suma, resta, multiplicación y división. Hacer cada operación en otro método de la clase Operación y llamarlos desde el mismo método initialize.

Programa: ejercicio135.rb

class Operaciones

  def initialize
    print "Ingrese primer valor:"
    @valor1 = gets.to_i
    print "Ingrese segundo valor:"
    @valor2 = gets.to_i
    sumar
    restar
    multiplicar
    division    
  end

  def sumar
    su = @valor1 + @valor2
    puts "La suma es #{su}"
  end

  def restar
    re = @valor1 - @valor2
    puts "La resta es #{re}"
  end

  def multiplicar
    pro = @valor1 * @valor2
    puts "El producto es #{pro}"
  end

  def division
    divi = @valor1 / @valor2
    puts "La division es #{divi}"
  end

end


operacion1 = Operaciones.new

Nuestro método initialize además de cargar los dos enteros procede a llamar a los métodos que calculan la suma, resta, multiplicación y división de los dos valores ingresados.

Como vemos las llamadas desde un método a otro solo se hace indicando su nombre:

  def initialize
    print "Ingrese primer valor:"
    @valor1 = gets.to_i
    print "Ingrese segundo valor:"
    @valor2 = gets.to_i
    sumar
    restar
    multiplicar
    division    
  end

El método sumar multiplica los dos atributos @valor1 y @valor2 y lo almacena en una variable local llamada "su" (no lleva @ la variable "su" ya que es una variable local a dicho método):

  def sumar
    su = @valor1 + @valor2
    puts "La suma es #{su}"
  end

En el bloque principal del programa creamos un objeto de la clase Operaciones:

operacion1 = Operaciones.new

Problema 2:

Plantear una clase que administre un Hash que almacene como clave el nombre de un alumno y como valor su nota (cargar 5 alumnos)
Mostrar un menú de opciones que permita:

1- Cargar alumnos.
2- Listar alumnos.
3- Mostrar alumnos con notas mayores o iguales a 7.
4- Finalizar programa.

Programa: ejercicio136.rb

class Alumnos

  def initialize
    @notas = Hash.new
  end

  def menu
    opcion = 0
    while opcion != 4
      puts "1- Cargar alumnos"
      puts "2- Listar alumnos"
      puts "3- Listado de alumnos con notas mayores o iguales a 7"
      puts "4- Finalizar programa"
      print "Ingrese su opcion:"
      opcion= gets.to_i
      if opcion == 1
        cargar
      elsif opcion == 2
        listar
      elsif opcion == 3
        notas_altas
      end
    end
  end    
    
  def cargar
    @notas.clear
    for indice in 1..5
      print "Ingrese nombre del alumno:"
      alumno = gets.chomp
      print "Nota del alumno:"
      no = gets.to_i
      @notas[alumno] = no
    end
  end

  def listar
    puts "Listado completo de alumnos"
    @notas.each do |nombre, no|
      puts "Alumno #{nombre} su nota es #{no}"
    end
    puts "-" * 50
  end

  def notas_altas
    puts "Alumnos con notas superiores o iguales a 7"
    @notas.each do |nombre, no|
      if no >= 7
        puts "#{nombre} #{no}"
      end
    end
    puts "-" * 50
  end    

end

# bloque principal

alumnos = Alumnos.new
alumnos.menu

Si ejecutamos el programa podemos ver como aparece un menú de opciones y podemos seleccionar para cargar, listar etc.:

llamada metodos ruby

El bloque principal del programa es muy sencillo, solo creamos un objeto de la clase Alumno y llamamos posteriormente al método menu:

# bloque principal

alumnos = Alumnos.new
alumnos.menu

Ahora analicemos la clase Alumno, en el método initialize procedemos a crear un atributo de tipo Hash donde se almacenarán los nombres de alumnos (clave del Hash) y sus notas (valor del Hash):

class Alumnos

  def initialize
    @notas = Hash.new
  end

El método menu muestra una serie de opciones y solicita al operador que elija una de ellas, según cual de ellas selecciona procede a llamar al método respectivo:

  def menu
    opcion = 0
    while opcion != 4
      puts "1- Cargar alumnos"
      puts "2- Listar alumnos"
      puts "3- Listado de alumnos con notas mayores o iguales a 7"
      puts "4- Finalizar programa"
      print "Ingrese su opcion:"
      opcion= gets.to_i
      if opcion == 1
        cargar
      elsif opcion == 2
        listar
      elsif opcion == 3
        notas_altas
      end
    end
  end    

El método menu se repite el while mientras no se ingrese en la variable local opcion el valor 4.

El método cargar se llama desde el método menu, en el mismo procedemos a cargar 5 elementos en el Hash:

  def cargar
    @notas.clear
    for indice in 1..5
      print "Ingrese nombre del alumno:"
      alumno = gets.chomp
      print "Nota del alumno:"
      no = gets.to_i
      @notas[alumno] = no
    end
  end

Llamamos al método clear del Hash por si ya habíamos cargado otros alumnos (esto ocurriría si llamamos al método cargar varias veces)

El método listar muestra todos los nombres de alumnos y sus notas recorriendo el Hash mediante el método each:

  def listar
    puts "Listado completo de alumnos"
    @notas.each do |nombre, no|
      puts "Alumno #{nombre} su nota es #{no}"
    end
    puts "-" * 50
  end

Finalmente el método notas_altas muestra solo los alumnos cuyas notas sean igual o superior a 7:

  def notas_altas
    puts "Alumnos con notas superiores o iguales a 7"
    @notas.each do |nombre, no|
      if no >= 7
        puts "#{nombre} #{no}"
      end
    end
    puts "-" * 50
  end    

Problema propuesto

  • Confeccionar una clase que administre una agenda personal. Se debe almacenar el nombre de la persona como clave del Hash y su número telefónico como valor del Hash.
    Debe mostrar un menú con las siguientes opciones:
    1- Carga de un contacto en la agenda.
    2- Listado completo de la agenda.
    3- Consulta ingresando el nombre de la persona.
    4- Modificación de un teléfono
    5- Finalizar programa.
Solución
ejercicio137.rb

class Agenda

  def initialize
    @contactos = Hash.new
  end
 
  def menu
    opcion = 0
    while opcion != 5
      puts "1- Carga de un contacto en la agenda"
      puts "2- Listado completo de la agenda"
      puts "3- Consulta ingresando el nombre de la persona"
      puts "4- Modificacion del telefono"
      puts "5- Finalizar programa"
      print "Ingrese su opcion:"
      opcion = gets.to_i
      if opcion == 1
        cargar
      elsif opcion == 2
        listado
      elsif opcion == 3
        consulta
      elsif opcion == 4
        modificacion
      end
    end
  end

  def cargar
    print "Ingrese el nombre de la persona:"
    nombre = gets.chomp
    print "Ingrese el numero de telefono:"
    telefono = gets.to_s
    @contactos[nombre] = telefono
    puts "-" * 50
  end  
        
  def listado
    puts "-" * 50
    puts "Listado completo de la agenda"
    @contactos.each do |nombre, telefono|
      puts "El teléfono de #{nombre} es #{telefono}"
    end
    puts "-" * 50
  end
    
  def consulta
    puts "-" * 50
    print "Ingrese el nombre de la persona a consultar:"
    nombre = gets.chomp
    if @contactos.include? nombre
      puts "El teléfono de #{nombre} #{@contactos[nombre]}"
    else
      puts "No existe un contacto con ese nombre"
    end  
    puts "-" * 50
  end

  def modificacion
    puts "-" * 50
    print "Ingrese el nombre de la persona a modificar su teléfono:"
    nombre = gets.chomp
    if @contactos.include? nombre
      print "Ingrese el nuevo número de teléfono:"
      telefono = gets.to_s
      @contactos[nombre] = telefono
    else
      puts "No existe un contacto con ese nombre"
    end
    puts "-" * 50
  end

end
        

# bloque principal

agenda=Agenda.new
agenda.menu