Al escribir funciones en Elixir, podemos hacer uso de un estilo asertivo con la coincidencia de patrones:
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
La coincidencia de patrones se realiza de forma explícita con el operador de coincidencia, =/2.
Las coincidencias tienen éxito cuando la forma de los datos del lado izquierdo del operador coincide con el lado derecho.
Cuando las coincidencias tienen éxito, las variables de la izquierda se vinculan a los valores de la derecha.
Usar un guion bajo, _, nos permite ignorar los valores en esos lugares.
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
El operador pin ^ se puede usar para evitar volver a vincular una variable y, en su lugar, comparar el patrón con su valor existente.
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
Las coincidencias de patrones también pueden darse en la cabecera de una cláusula de función, de modo que solo los argumentos que coincidan con el patrón invocarán la función.
Las variables se pueden vincular en una coincidencia de patrones de una cláusula de función.
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