هنگام نوشتن توابع 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