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