29 - Métodos: con cantidad variable de parámetros (operador splat)

Otra variante en la declaración de un método en Ruby es la definición de una cantidad variable de parámetros.

Para definir una cantidad variable de parámetros debemos anteceder el caracter asterísco (*) al parámetro del método (operador splat)

Problema 1:

Confeccionar un método que reciba n enteros (siendo n = 0,1,2,3,4,5,6 etc.) valores enteros, retornar la suma de dichos parámetros.

Programa: ejercicio125.rb

def sumar(*datos)
  suma = 0
  datos.each {|elemento| suma = suma + elemento}
  return suma
end

# bloque principal

print "La suma de 1+2="
puts sumar 1, 2
print "La suma de 1+2+3+4="
puts sumar 1, 2, 3, 4
print "La suma de 1+2+3+4+5+6+7+8+9+10="
puts sumar 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

En Ruby debemos anteceder el caracter * al nombre del parámetro, con esto logramos que pueda recibir una cantidad variable de datos que se almacenan en un arreglo.

def sumar(*datos)
  suma = 0
  datos.each {|elemento| suma = suma + elemento}
  return suma
end

Como se trata de un arreglo procedemos a sumar sus elementos iterando con el método each.

Cuando llamamos al método sumar podemos hacerlo enviando una cantidad variable de datos:

puts sumar 1, 2

Podemos llamar al método enviando 4 parámetros:

puts sumar 1, 2, 3, 4

Y en general podemos llamar al método enviando cualquier cantidad de enteros:

puts sumar 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

Operador splat en la llamada a un método.

Se puede utilizar el operador splat cuando llamamos un método y en este caso tiene por objetivo descomponer un Array:

def sumar(x1, x2)
  x1 + x2
end

# bloque principal

arreglo = [10, 20]
puts sumar *arreglo

En este ejemplo el método sumar debe recibir dos datos. Mediante el operador splat cuando llamamos al método sumar desde el bloque principal descomponemos el Array:

arreglo = [10, 20]
puts sumar *arreglo

Problema propuesto

  • Confeccionar un método que reciba una serie de edades y retorne la cantidad que son mayores o iguales a 18.
Solución
ejercicio126.rb

def cantidad_mayores18(*edades)
  cant=0
  edades.each do |edad|
    if edad >=18
      cant = cant + 1
    end  
  end
  return cant
end

# bloque principal

puts "La cantidad de personas mayores a 18 son: #{cantidad_mayores18(23,6,8,19,24)}"