Elixir é uma linguagem de tipagem dinâmica, o que significa que o tipo de uma variável só é verificado em tempo de execução. Usando o operador de correspondência =, podemos vincular um valor de qualquer tipo a um nome de variável:
# Bound an integer value of 1
count = 1
# You may re-bind variables
count = 2
# You may re-bind any type to a variable
count = false
# Strings can be created by enclosing characters within double quotes
message = "Success!"
Elixir é uma linguagem de programação funcional e exige que todas as funções nomeadas sejam definidas em um módulo. A palavra-chave defmodule é usada para definir um módulo. Todos os módulos estão disponíveis para todos os outros módulos em tempo de execução e não exigem um modificador de acesso para ficarem visíveis para outras partes do programa. Um módulo é análogo a uma classe em outras linguagens de programação.
defmodule Calculator do
# ...
end
Funções nomeadas precisam ser definidas em um módulo. A palavra-chave def é usada para definir uma função nomeada pública.
Cada função pode ter zero ou mais argumentos. O valor da última expressão de uma função é sempre retornado implicitamente.
defmodule Calculator do
def add(x, y) do
x + y
end
end
Para invocar uma função, especificamos o nome do módulo e da função e passamos argumentos para cada um dos argumentos da função.
sum = Calculator.add(1, 2)
# => 3
A palavra-chave defp pode ser usada em vez de def para definir uma função privada. Funções privadas só podem ser usadas de dentro do mesmo módulo que as definiu.
Ao invocar uma função dentro do mesmo módulo em que ela foi definida, o nome do módulo pode ser omitido.
Você também pode escrever funções curtas usando uma sintaxe de uma linha (repare na vírgula , e nos dois-pontos : em volta da palavra-chave do).
defmodule Calculator do
def subtract(x, y) do
private_subtract(x, y)
end
defp private_subtract(x, y), do: x - y
end
difference = Calculator.subtract(7, 2)
# => 5
difference = Calculator.private_subtract(7, 2)
# => ** (UndefinedFunctionError) function Calculator.private_subtract/2 is undefined or private
# Calculator.private_subtract(7, 2)
É comum nos referirmos às funções pela sua aridade. A aridade de uma função é o número de argumentos que ela aceita.
# add/3 because this function has three arguments, thus an arity of 3
def add(x, y, z) do
x + y + z
end
Nomes de módulos devem usar PascalCase. Um nome de módulo precisa começar com uma letra maiúscula A-Z e pode conter letras a-zA-Z, números 0-9 e sublinhados _.
Nomes de variáveis e funções devem usar snake_case. Um nome de variável ou função precisa começar com uma letra minúscula a-z ou um sublinhado _, pode conter letras a-zA-Z, números 0-9 e sublinhados _, e pode terminar com um ponto de interrogação ? ou um ponto de exclamação !.
Elixir tem uma biblioteca padrão muito rica e bem documentada. A documentação está disponível online em hexdocs.pm/elixir. Salve este link em algum lugar: você vai usá-lo muito!
A maioria dos tipos de dados embutidos tem um módulo correspondente que oferece funções para trabalhar com aquele tipo de dados, por exemplo: existe o módulo Integer para números inteiros, o módulo String para strings, o módulo List para listas e assim por diante.
Um módulo notável é o módulo Kernel. Ele fornece as capacidades básicas sobre as quais o resto da biblioteca padrão é construído, como operadores aritméticos, macros de fluxo de controle e muito mais. As funções do módulo Kernel são importadas automaticamente, então você pode usá-las sem o prefixo Kernel..
Os comentários podem ser usados para deixar anotações para outros desenvolvedores que leem o código-fonte. Comentários de uma linha em Elixir são precedidos por #.
Neste exercício, você vai escrever um pouco de código para ajudar a preparar uma lasanha incrível a partir do seu livro de receitas favorito.
Você tem cinco tarefas, todas relacionadas ao tempo gasto no preparo da lasanha.
Defina a função Lasagna.expected_minutes_in_oven/0, que não recebe nenhum argumento e retorna quantos minutos a lasanha deve ficar no forno. De acordo com o livro de receitas, o tempo esperado no forno em minutos é 40:
Lasagna.expected_minutes_in_oven()
# => 40
Defina a função Lasagna.remaining_minutes_in_oven/1, que recebe como argumento os minutos reais que a lasanha já passou no forno e retorna quantos minutos a lasanha ainda precisa ficar no forno, com base no tempo esperado no forno em minutos da tarefa anterior.
Lasagna.remaining_minutes_in_oven(30)
# => 10
Defina a função Lasagna.preparation_time_in_minutes/1, que recebe como argumento o número de camadas que você adicionou à lasanha e retorna quantos minutos você gastou preparando a lasanha, supondo que cada camada leva 2 minutos para preparar.
Lasagna.preparation_time_in_minutes(2)
# => 4
Defina a função Lasagna.total_time_in_minutes/2, que recebe dois argumentos: o primeiro argumento é o número de camadas que você adicionou à lasanha, e o segundo argumento é o número de minutos que a lasanha já passou no forno. A função deve retornar quantos minutos no total você trabalhou no preparo da lasanha, que é a soma do tempo de preparo em minutos com o tempo em minutos que a lasanha passou no forno até o momento.
Lasagna.total_time_in_minutes(3, 20)
# => 26
Defina a função Lasagna.alarm/0, que não recebe nenhum argumento e retorna uma mensagem indicando que a lasanha está pronta para comer.
Lasagna.alarm()
# => "Ding!"
Crie sua conta no Exercism para aprender e dominar Elixir com 58 conceitos168 exercícios e mentoria humana de verdade, tudo de graça.