Fork me on GitHub

Estructuras de control

Some contents of this translation may be outdated.
Several major changes were applied to the original lesson since the last update.

En esta lección veremos las estructuras de control disponibles en Elixir

Tabla de contenidos

if y unless

Es probable que hayas visto if/2 antes, y si has utilizado Ruby, estás familiarizado con unless/2. En Elixir ambos funcionan de la misma forma pero están definidos como macros, no son construcciones propias del lenguaje; puedes encontrar su implementación en el módulo Kernel.

Debería tenerse en cuenta que en Elixir, los únicos valores falsos son nil y el booleano false.

iex> if String.valid?("Hello") do
...>   "Valid string!"
...> else
...>   "Invalid string."
...> end
"Valid string!"

iex> if "a string value" do
...>   "Truthy"
...> end
"Truthy"

Usar unless/2 es como if/2 solo que trabaja en forma inversa:

iex> unless is_integer("hello") do
...>   "Not an Int"
...> end
"Not an Int"

case

Si es necesario buscar una coincidencia en múltiples patrones podemos usar case:

iex> case {:ok, "Hello World"} do
...>   {:ok, result} -> result
...>   {:error} -> "Uh oh!"
...>   _ -> "Catch all"
...> end
"Hello World"

La variable _ es una inclusión importante en la declaración case. Sin esto, cuando no se encuentre una coincidencia, se lanzará un error:

iex> case :even do
...>   :odd -> "Odd"
...> end
** (CaseClauseError) no case clause matching: :even

iex> case :even do
...>   :odd -> "Odd"
...>   _ -> "Not Odd"
...> end
"Not Odd"

Considera _ como el else que coincidirá con “todo lo demás”.
Ya que case se basa en la coincidencia de patrones, se aplican las mismas reglas y restricciones. Si intentas coincidir con variables existentes debes usar el operador pin ^:

iex> pie = 3.14
 3.14
iex> case "cherry pie" do
...>   ^pie -> "Not so tasty"
...>   pie -> "I bet #{pie} is tasty"
...> end
"I bet cherry pie is tasty"

Otra característica interesante de case es que este soporta cláusulas de guardia:

Este ejemplo proviene directamente de la guía oficial de Elixir Getting Started.

iex> case {1, 2, 3} do
...>   {1, x, 3} when x > 0 ->
...>     "Will match"
...>   _ ->
...>     "Won't match"
...> end
"Will match"

Revisa la documentación oficial para Expresiones permitidas en cláusulas de guardia.

cond

Cuando necesitamos coincidencias con condiciones, y no valores, podemos cambiar a cond; esto es parecido a else if o elsif en otros lenguajes:

Este ejemplo proviene directamente de la guía oficial de Elixir Getting Started.

iex> cond do
...>   2 + 2 == 5 ->
...>     "This will not be true"
...>   2 * 2 == 3 ->
...>     "Nor this"
...>   1 + 1 == 2 ->
...>     "But this will"
...> end
"But this will"

Como case, cond lanzará un error si no hay una coincidencia, para manejar esto, podemos definir una condición cuyo valor es true:

iex> cond do
...>   7 + 1 == 0 -> "Incorrect"
...>   true -> "Catch all"
...> end
"Catch all"

Share This Page