Functions
| Define with def | |
| Arity matters | |
| Private with defp | |
| @doc and @spec sketches |
Define with def
The def keyword names a function inside a module, and do blocks wrap its body.
The last expression becomes the result, with no return word needed.
Call it by module, name, and arguments, exactly as the last line shows.
defmodule Hi do
def greet(name) do
"hi #{name}"
end
end
Hi.greet("Ada")
Arity matters
The name plus the argument count, called arity, identifies each function.
Greet with one argument and greet with two are two separate functions that live side by side.
Calling with the wrong count raises UndefinedFunctionError.
defmodule Hi do
def greet(name), do: name
def greet(first, last), do: {first, last}
end
Hi.greet("Ada")
Hi.greet("Ada", "Lovelace")
Private with defp
The defp keyword marks a helper that only its own module can call.
Public def functions form the outside contract, while private ones hide the steps.
Calling a private function from outside raises UndefinedFunctionError.
defmodule Hi do
def greet(name), do: wrap(name)
defp wrap(name), do: {name, name}
end
Hi.greet("Ada")
@doc and @spec sketches
The @doc attribute writes the help text shown by documentation tools.
The @spec attribute sketches the accepted types and the result type.
Both sit directly above the function they describe.
defmodule Calc do
@doc "Adds two numbers."
@spec add(number(), number()) :: number()
def add(a, b), do: a + b
end
Calc.add(2, 3)
Next: Defaults and clauses
Article author: Arthur Isaev