Powered by AppSignal & Oban Pro
Would you like to see your link here? Contact us

case, cond

getting_started/case_and_cond.livemd

case, cond

Introducción

En esta clase, aprenderemos acerca de case, if, y cond para el control del flujo de nuestras funciones.

case

case nos permite comparar un valor con muchos patrones hasta que encontremos el primero que coincida:

case {1, 2, 3} do
  {4, 5, 6} ->
    "This clause won't match"

  {1, x, 3} ->
    "This clause will match and bind x to 2 in this clause"

  _ ->
    "This clause would match any value"
end

Si quieres hacer coincidir un patron con una variable existente, necesitas usar el operador pin ^:

x = 1

case 10 do
  ^x -> "Won't match"
  _ -> "Will match"
end

Cada cláusula del case permite especificar condiciones adicionales via guardas:

case {1, 2, 3} do
  {1, x, 3} when x > 0 ->
    "Will match"

  _ ->
    "Would match, if guard condition were not satisfied"
end

La primera cláusula de arriba coincidirá si el valor de x es positivo.

Ten presente que los errores en la guardas no se propagan, simplemente harán que la cláusula falle:

hd(1)
case 1 do
  x when hd(x) -> "Won't match"
  x -> "Got #{x}"
end

Si ninguna de la cláusulas coincide, obtendrás una excepción:

case :ok do
  :error -> "Won't match"
end

Para más información, consulta la documentación sobre guardas. Allí podrás ver cómo son usadas y que expresiones son permitidas en ellas.

Nota que las funciones anónimas también pueden llevar múltiples cláusulas y guardas:

f = fn
  x, y when x > 0 -> x + y
  x, y -> x * y
end
f.(1, 3)
f.(-1, 3)

El número de argumentos en cada cláusula de la función anónima debe ser el mismo, de lo contrario, obtendrás un error:

f2 = fn
  x, y when x > 0 -> x + y
  x, y, z -> x * y + z
end

cond

case es útil cuando necesitas hacer coincidir un resultado contra diferentes valores. Sin embargo, en muchas circunstancias, queremos verificar dicho resultado controla diferentes condiciones y encontrar la primera de ellas que no evalúa a un valor nil o false. En dichos casos, uno puede usar cond:

cond do
  2 + 2 == 5 ->
    "This will not be true"

  2 * 2 == 3 ->
    "Nor this"

  1 + 1 == 2 ->
    "But this will"
end

Esto es equivalente a las cláusulas else if en muchos lenguajes imperativos. Aunque se usa con menos frecuencia en Elixir.

Si todas las condiciones retornan nil o false, obtendrás una excepción de tipo CondClauseError. Por esta razón, puede que sea necesario agregar una condición final, igual a true, la cual siempre será cierta.

cond do
  2 + 2 == 5 ->
    "This is never true"

  2 * 2 == 3 ->
    "Nor this"

  true ->
    "This is always true (equivalent to else)"
end

Finalmente, nota que cond considera cualquier valor excepto nil y false como verdadero.

cond do
  hd([1, 2, 3]) ->
    "1 is considered as true"
end

Agradecimientos

Este tutorial es una traduccion libre del contenido presentado en la seccion case, cond, and if, el cual es parte de la guia oficial de Elixir