case

case es una estructura del lenguaje que permite hacer una tabla de matcheos mediante la cual es posible escoger una de entre muchas expresiones resultantes en función de cuál es el primer matcheo compatible.

En Elixir, el condicional case nos permite combinar el poder del pattern matching con la toma de decisiones condicionales, lo que resulta en una herramienta muy versátil para manejar múltiples casos de forma clara y elegante. A diferencia de if o cond, que evalúan condiciones booleanas, case evalúa una expresión y la compara contra varios patrones, ejecutando el bloque correspondiente al primer patrón que coincida.

Para usar case, primero definimos la expresión que queremos evaluar. Por ejemplo, si tenemos una variable exp que contiene el resultado de una operación, podemos escribir:

case exp do
  patrón_1 -> expresión_1
  patrón_2 -> expresión_2
  ...
end

Cada patrón a la izquierda de la flecha -> se intenta hacer coincidir con el valor de exp. Si el patrón encaja, se ejecuta la expresión a la derecha. Por ejemplo, si exp es {:ok, "hola"}, podemos hacer:

case exp do
  {:ok, x} -> "Ha resuelto correctamente con #{x}"
  {:error, _} -> "No ha resuelto correctamente"
end

Aquí, el patrón {:ok, x} hace un pattern match con la tupla, y además vincula la variable x al valor "hola". Esa variable solo existe dentro del bloque de la flecha, por lo que no podemos usar x fuera de ese contexto. Si no necesitamos usar una variable, podemos reemplazarla por _ para evitar warnings de variables no usadas.

Una característica muy potente de case es que podemos añadir guardas a los patrones para afinar aún más las condiciones. Por ejemplo, podemos hacer que un patrón solo coincida si una variable es un número:

case exp do
  {:ok, x} when is_number(x) -> "Ha resuelto correctamente con un número: #{x}"
  {:ok, _} -> "Ha resuelto correctamente con algo que no es número"
  {:error, _} -> "No ha resuelto correctamente"
end

Las guardas se añaden con la palabra clave when y permiten combinar el pattern matching con condiciones adicionales.

Es importante tener un patrón comodín al final del bloque case, que suele ser _, para cubrir cualquier caso no previsto. Esto evita errores en tiempo de ejecución si la expresión no coincide con ninguno de los patrones anteriores. Por ejemplo:

case exp do
  {:ok, x} -> "Ok con #{x}"
  {:error, _} -> "Error"
  _ -> "Caso no previsto"
end

Si colocamos el patrón comodín al principio, este atrapará cualquier valor y los patrones siguientes nunca se evaluarán, por lo que siempre debe ir al final.

En cuanto a cuándo usar case frente a cond o if, la regla general es que case es ideal cuando queremos hacer pattern matching sobre una expresión, mientras que cond es más adecuado para evaluar múltiples condiciones booleanas. El if se reserva para condiciones simples. Así, case nos permite escribir código más expresivo y claro cuando trabajamos con estructuras de datos que queremos descomponer o analizar según su forma.

En definitiva, case es una herramienta fundamental en Elixir que combina la potencia del pattern matching con la flexibilidad de los condicionales, permitiéndonos manejar múltiples escenarios de forma elegante y segura.

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