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!
Top comments (1)
Isso me lembra muito Prolog.