编写 Elixir 函数时,我们可以采用断言式的风格,并结合模式匹配:
def read_file() do
{:ok, contents} = File.read("hello.txt")
contents
end
模式匹配通过匹配运算符=/2显式完成。
当运算符左侧数据的_形状_与右侧一致时,匹配成功。
匹配成功时,左侧的变量会绑定到右侧的值。
使用下划线_可以忽略对应位置的值。
{:ok, number, _} = {:ok, 5, [4.5, 6.3]}
number
# => 5 is bound to this variable
固定运算符^可以阻止变量被重新绑定,转而对它已有的值进行模式匹配。
number = 10
{:ok, ^number, _} = {:ok, 5, [4.5, 6.3]}
# => ** (MatchError) no match of right hand side value: {:ok, 5, [4.5, 6.3]}
模式匹配也可以出现在函数子句的头部,这样只有匹配该模式的参数才会调用该函数。
变量可以在函数子句的模式匹配中绑定。
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