case
| Match many shapes | |
| Bind in patterns | |
| Guards in case | |
| _ catches all |
Match many shapes
The case expression compares one value against many patterns in order.
Each arm states a shape, an arrow, and the result for that shape.
The first arm that fits decides the value of the whole expression.
response = {:ok, 42}
case response do
{:ok, body} -> body
{:error, reason} -> {:failed, reason}
end
Bind in patterns
Names inside an arm bind the pieces they stand for.
Those names live only inside their own arm and vanish after it.
The arm below splits the pair and reuses both parts at once.
pair = {:ok, 42}
case pair do
{:ok, n} -> n + 1
{:error, _} -> 0
end
Guards in case
Arms accept when guards for finer tests like ranges and comparisons.
The pattern matches first, and then the guard votes on the bound values.
Both must agree before the arm is allowed to run.
n = 7
case n do
x when x < 0 -> :negative
0 -> :zero
x -> :positive
end
_ catches all
A lone underscore matches anything and binds nothing.
It closes the case so no shape falls through to an error.
Place it last, after every specific arm has had its turn.
input = :quit
case input do
:go -> :moving
_ -> :stopped
end
Next: with chains
Article author: Arthur Isaev