Ao escrever funções em Elixir, podemos usar um estilo assertivo com pattern matching:
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
O pattern matching é feito explicitamente com o operador de correspondência, =/2.
As correspondências dão certo quando a forma dos dados no lado esquerdo do operador corresponde à do lado direito.
Quando a correspondência dá certo, as variáveis do lado esquerdo são vinculadas aos valores do lado direito.
Usar um underscore, _, permite ignorar os valores nessas posições.
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
O operador pin ^ pode ser usado para impedir que uma variável seja vinculada de novo e, em vez disso, fazer pattern matching com o valor que ela já tem.
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
O pattern matching também pode acontecer na cabeça de uma cláusula de função, de modo que só os argumentos que correspondem ao padrão invocam a função.
Variáveis podem ser vinculadas no pattern matching de uma cláusula de função.
defmodule Example do
def named_function(:a = atom_variable) do
{atom_variable, 1}
end
end
Example.named_function(:a)
# => {:a, 1}
# The first function clause matches, so it is invoked
Example.named_function(:b)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1