DEV Community

Cover image for Uma introdução ao Pattern Matching
Igor Giamoniano for Trybe

Posted on

Uma introdução ao Pattern Matching

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á!

the office

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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]
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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á!

bye - the office

Top comments (0)