Fork me on GitHub

Estruturas de Controle

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

Nesta lição iremos conhecer algumas estruturas de controle disponíveis em Elixir.

Sumário

if e unless

Existem chances de que você já tenha encontrado if/2 antes, e caso você tenha utilizado Ruby você é familiarizado com unless/2. Em Elixir eles trabalham praticamente da mesma forma porém são definidos como macros, não construtores da linguagem; Você pode encontrar a implementação deles em Kernel module.

Pode-se notar que em Elixir, os únicos valores falsos são nil e o 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 é bem parecido o uso do if/2 porém trabalhando de forma negativa:
elixir iex> unless is_integer("hello") do ...> "Not an Int" ...> end "Not an Int"

case

Caso seja necessário combinar multiplos padrões nós poderemos utilizar case:

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

A variável _ é uma importante inclusão na declaração do case. Sem isso a falha em procura de combinação iria causar um erro:

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

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

Considere _ como o else que irá igualar com “todo o resto”.
Já que case depende de combinação de padrões, todas as mesmas regras e retrições são aplicadas. Se você pretende procurar padrões em variáveis que já existem, você irá precisar utilizar o 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"

Outra característica interessante do case é o seu suporte para cláusulas de guarda:

Este exemplo vem diretamente do Guia Introdutório oficical do Elixir.

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

Verifique a documentação oficial sobre Expressões permitidas em clausulas guard.

cond

Quando necessitamos associar condições, e não valores, nós podemos recorrer ao cond; Isso é semelhante ao else if ou elsif de outras linguagens:

Este exemplo vem diretamente do Guia Introdutório oficial do Elixir._

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 irá gerar um erro caso não seja achado associação. Para lidar com isso, nós podemos definir a condição para true:

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

Compartilhe essa página