Elixir :: Pattern Matching
Daniel Cunha
Posted on December 22, 2021
Uma das coisas que inicialmente me deram um nó ao estudar Elixir foi o operador =
. Apesar de ser utilizado para atribuir valores a variáveis, esse operador no Elixir é chamado de match operator
Ao executar um trecho de código como este:
iex> x = 1
1
iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1
Podemos notar que a expressão 1 = x
é uma expressão válida e isso é possível porque ambos os lados (direito e esquerdo) representam o mesmo valor, que no caso é 1
. Entretando quando esses dois lados não dão match, um MatchError
é retornado.
Só podemos atribuir valor para uma variável quando definida no lado esquerdo do operador =
:
iex> x = 1
1
Pattern Matching não funciona apenas para valores simples, você também pode utilizar para outros tipos, como:
iex> {a, b, c} = {:hello, "world", 42}
{:hello, "world", 42}
iex> a
:hello
iex> b
"world"
Os dois lados (esquerdo e direto) devem ser do mesmo tipo, caso contrário um MatchError
acontecerá, como no exemplo abaixo que tento fazer um match entre uma tupla e uma lista:
iex> {a, b, c} = [:hello, "world", 42]
** (MatchError) no match of right hand side value: [:hello, "world", 42]
Para solucionar este problema, poderíamos fazer:
iex> [a, b, c] = [:hello, "world", 42]
[:hello, "world", 42]
iex> a
:hello
iex> b
"world"
iex> c
42
Utilizar tamanhos diferentes entre os dois lados, também resultará em erro.
iex> [a, b] = [:hello, "world", "aloha"]
** (MatchError) no match of right hand side value: [:hello, "world", "aloha"]
Algumas vezes queremos mesmo ignorar certos valores em nosso matching, para isso o Elixir possui uma variável especial, que é o _
. Essa variável nos possibilita ignorar certos valores em um pattern matching, ou seja, se quizermos ignorar o último elemento no matching entra as listas acima, poderíamos fazer da seguinte forma:
iex> [a, b, _] = [:hello, "world", "aloha"]
[:hello, "world", "aloha"]
iex> a
:hello
iex> b
"world"
Pattern Matching vai além das variáveis, podemos utilizar isso com functions e muito mais, porém veremos como utilizar isto em um próximo post!
Posted on December 22, 2021
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.