Intro
Ufa, nós aprendemos bastante coisa sobre a linguagem de programação Elixir!
Configuramos o nosso Setup, iniciamos um projeto no Mix, falamos sobre programação funcional e Aridade.
Agora falemos de um assunto, considerado um dos ‘cores’ do Elixir, falemos de Pattern Matching então prepara o café e vamos lá!
Pattern Matching
Começaremos do início ok? Na maior parte das linguagens de programação o sinal de igual (=) é usado como um operador de atribuição, ou seja, eu atribuo um valor a uma determinada variável, no Elixir isso não se aplica!
No elixir o sinal de igual é um operador de correspondência (’Match operator’).
Vamos dar uma olhada no exemplo abaixo:
x = 1 # 1
1 = x # 1
2 = x **(MatchError) no match of right hand side value: 1
Vamos entender o que esta acontecendo, na linha 1 estamos correspondendo o valor 1 a uma variável x, dando um match!
Na linha 2 estamos correspondendo o valor 1 a uma variável que possui valor 1, deu match com certeza!
Na linha 3 estamos correspondendo o valor 2 a variável x que possui valor 1, e isso nitidamente não da match, é exatamente isso que o log esta nos informando!
No Pattern Matching o lado direito deve ser correspondente ao lado esquerdo. Se você veio do JavaScript, deve estar pensando que o Pattern Matching é muito parecido com Destrutcing. Na verdade, são coisas diferentes, mas através do Pattern Matching conseguimos fazer destruct no Elixir, vamos dar uma olhada neste outro exemplo:
[1, x, 3] = [1, 2, 3]
# [1, x, 3] = [1, 2, 3]
x
# 2
No exemplo anterior estamos correspondendo a variável x o segundo valor da lista a direita, também poderíamos fazer o seguinte:
[y, x, 3] = [1, 2, 3]
# [y, x, 3] = [1, 2, 3]
y
# 1
x
# 2
Lembrando que os dois lados devem ser correspondentes, nos exemplos abaixo temos o mesmo erro que vimos la atrás:
[y, x, 3] = [1, 2, 3, 4]
** (MatchError) no match of right hand side value: [1, 2, 3, 4]
[y, x, 3] = [1, 2]
** (MatchError) no match of right hand side value: [1, 2]
Mais alguns exemplos de Pattern Matching
No caso do map não precisamos referenciar todos os valores dos dois lados justamente porque no map não importa a ordem dos elementos, portanto podemos corresponder somente a chave que precisamos do valor.
%{school: school_name} = %{school: "Trybe", country: "BR"}
# %{school: "Trybe", country: "BR"}
school_name
# "Trybe"
Para concluir veja no próximo exemplo como usamos Pattern Matching para controle de fluxo em uma função de cláusula múltipla.
control_function = fn
{:ok, response} -> "Great: #{response}"
{:error, response} -> "Error: #{response}"
end
control_function.({:ok, "register concluded"})
# "Great: register concluded"
control_function.({:error, "Disconnected"})
# "Error: Disconnected"
Ao receber o argumento da função o Elixir faz a comparação com a cláusula, caso “dê match” ele envia o retorno esperado, senão envia uma exceção, por exemplo:
control_function.(5)
**(FunctionClauseError) no function clause matching in :erl_eval."-inside-an-interpreted-fun-"/1
Conclusão
Vimos então como o Pattern Matching é poderoso e, porque ele faz parte do core do Elixir, no próximo artigo falaremos sobre funções built in e como usamos no nosso dia a dia, até lá!
Top comments (0)