As annotations
Elixir brings the concept of module attributes from Erlang. For example:
defmodule MyServer do
@vsn 2
end
In the example above, we are explicitly setting the version attribute for that module. @vsn
is used by the code reloading mechanism in the Erlang VM to check if a module has been updated or not. If no version is specified, the version is set to the MD5 checksum of the module functions.
Elixir has a handful of reserved attributes. Here are just a few of them, the most commonly used ones:
@moduledoc
- provides documentation for the current module.@doc
- provides documentation for the function or macro that follows the attribute.@behaviour
- (notice the British spelling) used for specifying an OTP or user-defined behaviour.@before_compile
- provides a hook that will be invoked before the module is compiled. This makes it possible to inject functions inside the module exactly before compilation.
@moduledoc
and @doc
are by far the most used attributes, and we expect you to use them a lot. Elixir treats documentation as first-class and provides many functions to access documentation.
Let’s go back to the Math
module defined in the previous chapters, add some documentation and save it to the math.ex
file:
defmodule Math do
@moduledoc """
Provides math-related functions.
## Examples
iex> Math.sum(1, 2)
3
"""
@doc """
Calculates the sum of two numbers.
"""
def sum(a, b), do: a + b
end
Elixir promotes the use of markdown with heredocs to write readable documentation. Heredocs are multiline strings, they start and end with triple quotes, keeping the formatting of the inner text. We can access the documentation of any compiled module directly from IEx:
$ elixirc math.ex
$ iex
iex> h Math # Access the docs for the module Math
...
iex> h Math.sum # Access the docs for the sum function
...
We also provide a tool called ExDoc which is used to generate HTML pages from the documentation.
You can take a look at the docs for Module for a complete list of supported attributes. Elixir also uses attributes to define typespecs.
This section covers built-in attributes. However, attributes can also be used by developers or extended by libraries to support custom behaviour.