Pattern matching with `Kernel.match`
Pattern matching is powerful, but when iterating over a list with an Enum function you must allow all variants of the list to be processed. So this fails:
sample = [{1, "A"}, {2, "B"}]
> Enum.filter(sample, fn ({_, "B"}) -> true end)
** (FunctionClauseError) no function clause matching in :erl_eval."-inside-an-interpreted-fun-"/1
The following arguments were given to :erl_eval."-inside-an-interpreted-fun-"/1:
# 1
{1, "A"}
(stdlib) :erl_eval."-inside-an-interpreted-fun-"/1
(stdlib) erl_eval.erl:826: :erl_eval.eval_fun/6
(elixir) lib/enum.ex:2898: Enum.filter_list/2
Instead of using pattern matching here we can just use an anonymous function that takes all args and makes a comparison.
sample = [{1, "A"}, {2, "B"}]
Enum.filter(sample, fn ({_, letter}) -> letter == "B" end)
# [{2, "B"}]
But the cool way to do it is with Kernel.match?
. Which according to the docs is:
A convenience macro that checks if the right side (an expression) matches the left side (a pattern).
What that looks like:
sample = [{1, "A"}, {2, "B"}]
Enum.filter(sample, &match?({_, "B"}, &1))
# [{2, "B"}]
H/T Taylor Mock
Tweet