Bucles e Iteradores en Ruby

LOOP (Bucle)

loop do
  puts "QUIERES EJECUTAR OTRO CICLO? s/n"
  respuesta = gets.chomp

  if respuesta == "n"
    break
  end
  puts "Volvemos a otro Ciclo"
end

 

TIMES(Repetir X numero de veces)

iteracion = 1

10.times do |time|
  puts "Iterador #{time+1}º llamada"
  iteracion += 1
end

#RESULTADO:
# Iterador 1º llamada
# Iterador 2º llamada
# Iterador 3º llamada
# Iterador 4º llamada
# Iterador 5º llamada
# Iterador 6º llamada
# Iterador 7º llamada
# Iterador 8º llamada
# Iterador 9º llamada
# Iterador 10º llamada

 

UPTO(Subir hasta)

1.upto(10) do |number|
  print "#{number}"
end

#RESULT: 12345678910

DOWNTO(Bajar hasta)

10.downto(1) do |number|
  print "#{number}"
end
#RESULT: 10987654321

 

STEP

1.step(10,2) do |number|
  print "#{number}"
end

#RESULT: 13579

 

IF(Si)

Con Modificadores de Declaración cuando es una sola expresión

medicion = 30

if medicion > 0
  puts "Entro"
end
medicion = 30

puts "Entro" if medicion > 0

 

FOR…IN

arrayEjemplo= [1,2,3,4,5]

for number in arrayEjemplo
  print number
end

#RESULTADO=12345

**Esto es azúcar sintáctico ya que internamente se hace:

arrayEjemplo= [1,2,3,4,5]

arrayEjemplo.each do |number|
  print number
end

#RESULTADO=12345

 

WHILE (Mientras que)

vidas = 3
while vidas > 0
  puts "Sigo vivo. Tengo #{vidas} vidas"
  vidas -= 1
end

Con Modificador de Declaración cuando es una sola expresión:

medicion = 0
while medicion < 1000
  medicion = medicion+1
end
medicion = 0

medicion = medicion+1 while medicion < 1000

UNTIL (Hasta que)

vidas = 3
until vidas == 0
  puts "Sigo vivo. Tengo #{vidas} vidas"
  vidas -= 1
end

 

EACH (Para cada)

  • Strings:

"RUBEN".each_char do |char|
  puts "CARACTER --> #{char}"
end

#RESULTADO:
# CARACTER --> R
# CARACTER --> U
# CARACTER --> B
# CARACTER --> E
# CARACTER --> N
('a'..'f').each do |char|
  puts "Letra actual --> "+char
end

#Letra actual --> a
#Letra actual --> b
#Letra actual --> c
#Letra actual --> d
#Letra actual --> e
#Letra actual --> f
(1..5).each do |char|
  puts "Numero actual --> "+char.to_s
end

#Numero actual --> 1
#Numero actual --> 2
#Numero actual --> 3
#Numero actual --> 4
#Numero actual --> 5

 

  • Arrays:

array_example = [1,2,3,4,5,6]

array_example.each do |number|
  puts number
end

 

  • Colecciones de Hash:

contactos = {
    Alberto: 000000000,
    Barreto: 111111111,
    Carmelo: 222222222
}

contactos.each do |key,value|
  puts "La llave es #{key} y el valor es #{value}"
end

#RESULTADO:
#La llave es Alberto y el valor es 000000000
#La llave es Barreto y el valor es 111111111
#La llave es Carmelo y el valor es 222222222


contactos.each_key do |key| 
   puts "La llave es #{key}" 
end


contactos.each_value do |value| 
   puts "El valor es #{value}"
end

 

Implementar Iterador

def three_times
  yield
  yield
  yield
end

three_times { puts "HOLA" }

# RESULTADO:
# HOLA
# HOLA
# HOLA

Fibonacci

def fib_up_to(max)
  i1, i2 = 1, 1  # asignación paralela (i1 = 1 y i2 = 1)

  while i1 <= max
    yield i1
    i1, i2 = i2, i1+i2
  end

end

fib_up_to(1000) {|f| print f, " " }

#RESULTADO:
# 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987

 

INSTRUCCIONES DE CONTROL DE BUCLES

Break –> Termina el bucle inmediatamente

Redo –> Repite el bucle desde el principio sin volver a evaluar la condición o ir a buscar el siguiente elemento en un iterador

Next –> Salta al final del bucle a partir de la próxima iteracion.

Retry –> Reinicia cualquier tipo de bucle iterador