Defaults and clauses
| Default args with \\ | |
| Multiple clauses | |
| Guards choose | |
| Clause order matters |
Default args with \\
A double backslash gives a parameter a fallback value used when the caller skips it.
One definition then serves both short and full calls without extra clauses.
List defaulted parameters after the required ones.
defmodule Hi do
def greet(name \\ "guest") do
"hi #{name}"
end
end
Hi.greet()
Hi.greet("Ada")
Multiple clauses
One name can hold several clauses, and each clause matches a different shape.
Atoms pick roles, patterns pick data, and shared code stays in one place.
The calls below land on different clauses of the same function.
defmodule Hi do
def welcome(:admin), do: :all_access
def welcome(name), do: {:hello, name}
end
Hi.welcome(:admin)
Hi.welcome("Ada")
Guards choose
A when guard tests the arguments before a clause is allowed to run.
Guards use a small safe set of checks like comparisons and type tests.
The first clause whose pattern and guard both pass wins the call.
defmodule Num do
def label(n) when n < 0, do: :negative
def label(0), do: :zero
def label(n), do: :positive
end
Num.label(-2)
Num.label(0)
Num.label(7)
Clause order matters
Elixir tries clauses top to bottom and runs the first one that matches.
A catch all placed first would swallow every call below it.
Put narrow shapes first and the broad fallback last, as shown here.
defmodule Hi do
def hello(:admin), do: :boss
def hello(_name), do: :guest
end
Hi.hello(:admin)
Hi.hello("Ada")
Next: Pattern matching
Article author: Arthur Isaev