Elixir::패턴 매칭

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 codigo 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 e uma expressão válida e isso e possível porque ambos os lados (direito e esquerdo) Representativeam o mesmo valor, que no caso é 1 . Entretando quando esses dois lados não dão match, um MatchError é retornado.

Só podemos attribuir 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 quickermos ignorar o ultimo 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"


패턴 매칭 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!

좋은 웹페이지 즐겨찾기