← Ruby EspañolChapter 04 of 13

Control de Flujo

## Objetivos de Aprendizaje - Usar sentencias condicionales (if, unless, case) - Trabajar con bucles (while, until, for) - Dominar iteradores y Enumerable - Comprender control de bucles (break, next, redo) ## If-Unless ### Sentencia If ```ruby temperatura = 25 if temperatura > 30 puts "Caliente" elsif temperatura > 20 puts "Agradable" else puts "Frio" end ``` ### Sentencia Unless ```ruby # unless es lo opuesto de if (ejecuta cuando la condicion es falsa) unless temperatura > 30 puts "No hace calor" end # Equivalente a: if !(temperatura > 30) puts "No hace calor" end ``` ### Forma Modificadora ```ruby puts "Valido" if edad >= 18 puts "Menor" unless edad >= 18 # Modificadora de multiples lineas if puntaje > 90 grado = "A" end # Igual a: grado = "A" if puntaje > 90 ``` ### Operador Ternario ```ruby edad = 20 estado = edad >= 18 ? "adulto" : "menor" puts estado # "adulto" ``` ### Comparacion Combinada ```ruby # && - ambos deben ser verdaderos if edad >= 18 && tiene_licencia puts "Puede conducir" end # || - cualquiera puede ser verdadero if es_miembro || tiene_entrada puts "Entrada permitida" end ``` ## Case-When ### Sintaxis Basica ```ruby grado = case puntaje when 90..100 "A" when 80..89 "B" when 70..79 "C" when 60..69 "D" else "F" end ``` ### Forma de Una Linea ```ruby grado = case puntaje when 90..100 then "A" when 80..89 then "B" when 70..79 then "C" else "F" end ``` ### Case con Multiples Valores ```ruby dia = case dia_semana when "Sabado", "Domingo" "Fin de semana" when "Lunes", "Miercoles", "Viernes" "Clases MWF" else "Otro dia" end ``` ### Case sin Argumento ```ruby nombre = "Alicia" saludo = case when nombre.nil? "Quien eres?" when nombre.empty? "Hola, desconocido" else "Hola, #{nombre}" end ``` ## Bucles ### Bucle While ```ruby contador = 1 while contador <= 5 puts contador contador += 1 end ``` ### Bucle Until ```ruby # until ejecuta mientras la condicion sea falsa contador = 1 until contador > 5 puts contador contador += 1 end ``` ### Bucle For ```ruby # Iterar sobre un rango for i in 1..5 puts i end # Iterar sobre un array frutas = ["manzana", "banana", "cereza"] for fruta in frutas puts fruta end ``` ### Bucle como Iterador ```ruby # 5.times do 5.times { puts "Hola" } # upto 1.upto(5) { |n| puts n } # downto 5.downto(1) { |n| puts n } # step 0.step(10, 2) { |n| puts n } # 0, 2, 4, 6, 8, 10 ``` ## Iteradores ### Iterador Times ```ruby 5.times do |i| puts "Iteracion #{i}" end # Sin variable de bloque 3.times { puts "Hola" } ``` ### Iterador Each ```ruby # Array [1, 2, 3].each { |n| puts n } # Hash { a: 1, b: 2 }.each do |clave, valor| puts "#{clave}: #{valor}" end # Rango (1..5).each { |n| puts n } ``` ### Map (Collect) ```ruby # Transformar cada elemento numeros = [1, 2, 3, 4, 5] cuadrados = numeros.map { |n| n ** 2 } puts cuadrados # [1, 4, 9, 16, 25] # Con simbolo a proc nombres = ["alice", "bob", "charlie"] mayusculas = nombres.map(&:upcase) puts mayusculas # ["ALICE", "BOB", "CHARLIE"] ``` ### Select (Find All) ```ruby numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] pares = numeros.select { |n| n.even? } puts pares # [2, 4, 6, 8, 10] impares = numeros.reject { |n| n.even? } puts impares # [1, 3, 5, 7, 9] ``` ### Reduce (Inject) ```ruby numeros = [1, 2, 3, 4, 5] suma = numeros.reduce(0) { |acc, n| acc + n } puts suma # 15 producto = numeros.reduce(1) { |acc, n| acc * n } puts producto # 120 ``` ### Find (Detect) ```ruby numeros = [1, 2, 3, 4, 5] primer_par = numeros.find { |n| n.even? } puts primer_par # 2 todos_pares = numeros.all? { |n| n.even? } # false algun_par = numeros.any? { |n| n.even? } # true ninguno_negativo = numeros.none? { |n| n < 0 } # true ``` ### Otros Iteradores Utiles ```ruby numeros = [1, 2, 3] # each_with_index numeros.each_with_index do |num, indice| puts "#{indice}: #{num}" end # each_with_object numeros.each_with_object([]) { |n, arr| arr << n * 2 } # [2, 4, 6] # count numeros.count # 3 numeros.count { |n| n > 1 } # 2 # include? numeros.include?(2) # true ``` ## Control de Bucles ### Break ```ruby # Salir del bucle anticipadamente numeros = [1, 2, 3, 4, 5] numeros.each do |n| break if n == 3 puts n end # Salida: 1, 2 ``` ### Next ```ruby # Saltar a la siguiente iteracion numeros = [1, 2, 3, 4, 5] numeros.each do |n| next if n.even? puts n end # Salida: 1, 3, 5 ``` ### Redo ```ruby # Rehacer la iteracion actual contador = 0 5.times do contador += 1 if contador < 3 puts contador redo end end ``` ### Retry ```ruby # Reintentar todo el bloque (a menudo en rescue) conteo_reintentos = 0 begin # Simular fallo raise "Error" if conteo_reintentos < 2 puts "Exito" rescue conteo_reintentos += 1 retry end ``` ## Bucles Infinitos ```ruby # Ten cuidado! loop do puts "Presiona Ctrl+C para detener" # break es requerido end ``` ## Resumen - `if`/`unless`: ejecucion condicional - `case`/`when`: comparacion multiple - `while`/`until`: bucles con condicion - `for`: iterar sobre rangos/colecciones - Iteradores: `each`, `map`, `select`, `reduce`, `find` - Control de bucles: `break` (salir), `next` (saltar), `redo` (reintentar iteracion) - Forma modificadora: `puts "hola" if valido`

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →