Condicional IF y bloques DO-END

IF es la primera de las estructuras del lenguaje que vamos a ver. Evalúa a una expresión u otra según si una tercera expresión denominada condicional es verdadera o no. Por ejemplo, if A do B else C end evalúa a B si A, y evalúa a C si !A. Además, los bloques DO-END, que sirven para agrupar múltiples expresiones, evaluando a la última expresión del bloque.

En Elixir, la construcción if nos permite tomar decisiones en nuestro código evaluando una condición que determina qué expresión se debe ejecutar. Esta condición, que podemos llamar expresión discriminatoria, es una evaluación que resulta en un valor verdadero o falso, o en valores que Elixir interpreta como tales. Por ejemplo, los valores nil y false se consideran falsos, mientras que cualquier otro valor se considera verdadero.

La sintaxis básica del if en Elixir requiere tres elementos: la condición, una expresión que se ejecuta si la condición es verdadera y otra expresión que se ejecuta si la condición es falsa. Para delimitar estas expresiones, usamos bloques do-end. El bloque do indica el inicio de la expresión que se ejecuta cuando la condición es verdadera, y el end marca el final del bloque. Si queremos especificar qué hacer cuando la condición es falsa, usamos la palabra clave else seguida de otro bloque de código.

Por ejemplo, imaginemos que tenemos una variable edad con un valor de 20 y queremos imprimir un mensaje diferente según si la persona es mayor o menor de edad. Podríamos escribir:

if edad >= 18 do
  IO.puts("Eres mayor de edad")
else
  IO.puts("Eres menor de edad, no puedes entrar")
end

Aquí, si edad es mayor o igual a 18, se ejecutará la primera expresión dentro del bloque do, y si no, se ejecutará la expresión dentro del bloque else.

Una característica importante es que el if en Elixir es una expresión que devuelve un valor. Esto significa que podemos asignar el resultado del if a una variable y luego usarla, por ejemplo:

mensaje = if edad >= 18 do
  "Mayor de edad"
else
  "Menor de edad"
end

IO.puts(mensaje)

En este caso, la variable mensaje contendrá la cadena correspondiente según la condición, y luego la imprimiremos.

Si omitimos el bloque else, Elixir asume que la expresión para el caso falso es nil. Por ejemplo:

resultado = if edad >= 18 do
  "Mayor de edad"
end

IO.inspect(resultado)

Si edad es menor que 18, resultado será nil. Esto puede ser útil en ciertos casos, pero debemos tener en cuenta que no siempre queremos que el valor por defecto sea nil.

Otra particularidad de Elixir es que los bloques do-end pueden contener múltiples expresiones. Esto nos permite ejecutar varias líneas de código dentro de un mismo bloque, y el valor que devuelve el bloque será el resultado de la última expresión evaluada. Por ejemplo:

if edad >= 18 do
  IO.puts("Eres mayor de edad")
  "Mayor de edad"
else
  espera = 18 - edad
  IO.puts("Eres menor de edad, vuelve dentro de #{espera} años")
  "Menor de edad"
end

En este caso, dentro del bloque else definimos una variable local espera que calcula cuántos años faltan para ser mayor de edad, imprimimos un mensaje con esa información y finalmente devolvemos la cadena "Menor de edad". Aunque ejecutamos varias expresiones, el valor que devuelve el bloque es el de la última línea.

Esto nos permite escribir código más organizado y con lógica más compleja dentro de los bloques do-end, sin perder la naturaleza expresiva del lenguaje. Además, podemos incluir llamadas a funciones como IO.puts para imprimir mensajes de depuración o información adicional, siempre recordando que el valor final del bloque será el de la última expresión.

En resumen, el uso de if junto con los bloques do-end en Elixir nos ofrece una forma flexible y expresiva de controlar el flujo de nuestro programa, permitiendo tanto decisiones simples como bloques de código más elaborados que se ejecutan según las condiciones que definamos.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos