O Elixir facilita as práticas do Princípio Aberto-Fechado ao permitir que as funções tenham várias cláusulas. Assim, em vez de uma lógica de controlo extensa e fixa no código, podes escrever funções direcionadas que adicionam ou removem comportamento com facilidade.
O Elixir oferece várias cláusulas de função e guardas para escreveres:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
Em tempo de execução, o Elixir testa, de cima para baixo do ficheiro de código, qual a cláusula de função a invocar.
As variáveis que não são usadas devem ser precedidas por um underscore.
As guardas servem para impedir que o Elixir invoque funções, com base na avaliação dos argumentos feita pelas funções de guarda. As guardas começam com a palavra-chave when, seguida de uma expressão booleana. As funções de guarda são funções especiais que:
true ou false.Encontras uma lista de guardas comuns na documentação do Elixir. Inclui verificação de tipos, aritmética básica, comparações e operadores estritamente booleanos.
As funções podem declarar valores predefinidos para um ou mais argumentos. Vamos considerar esta função:
def number(n \\ 13), do: "That's not my favorite"
Quando é compilado, o Elixir cria uma definição de função para number/0 (sem argumentos) e number/1 (um argumento).
Se mais do que um argumento tiver valores predefinidos, os valores predefinidos são aplicados à função da esquerda para a direita, para preencher os argumentos em falta.
Se a função tiver mais do que uma cláusula, os argumentos predefinidos devem ser definidos num cabeçalho de função (uma função sem corpo) antes das cláusulas da função:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
Estás a criar um jogo online simples em que um amigo pode adivinhar um número secreto. Queres dar algum feedback, mas sem revelar a resposta com um palpite. Precisas de criar uma função que devolva respostas diferentes conforme a relação entre o palpite e o número secreto.
| Condição | Resposta |
|---|---|
| Quando o palpite coincide com o número secreto | "Correct" |
| Quando o palpite é mais um ou menos um do que o número secreto | "So close" |
| Quando o palpite é maior do que o número secreto | "Too high" |
| Quando o palpite é menor do que o número secreto | "Too low" |
| Quando não é feito nenhum palpite | "Make a guess" |
Todos os palpites e números secretos são números inteiros.
Implementa a função compare/2, que recebe dois argumentos, secret_number e guess, ambos números inteiros.
GuessingGame.compare(5, 5)
# => "Correct"
Modifica a função compare para responder a palpites maiores do que o número secreto.
GuessingGame.compare(5, 8)
# => "Too high"
Modifica a função compare para responder a palpites menores do que o número secreto.
GuessingGame.compare(5, 2)
# => "Too low"
Modifica a função compare para responder a palpites próximos do número secreto.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
Modifica a função compare para responder à ausência de palpite.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Inscreve-te no Exercism para aprenderes e dominares Elixir com 58 conceitos168 exercícios, e mentoria humana real, tudo grátis.