Behaviours in Elixir

Contents
Define callbacks
Adopt one
Compiler checks
GenServer is a behaviour (preview)

Define callbacks

A behaviour lists function contracts that adopter modules must fulfil. Each contract is a callback annotation with a name, argument types, and a return type.

defmodule Printer do @callback print(term) :: String.t() end

Printer demands one print function that takes any term and returns text. The annotation never runs, it only records the contract for the compiler.

Adopt one

A module adopts a behaviour with the behaviour annotation and then defines every listed callback. From that point the compiler links the module to the contract.

defmodule Laser do @behaviour Printer def print(text) do "laser: " <> text end end

Laser.print applied to a greeting returns a tagged string, and the behaviour annotation documents that Laser plays the Printer role. Callers can now accept any Printer module with confidence.

Compiler checks

The compiler compares each adopter against its contracts and warns about gaps. A missing function, a wrong arity, or a mistyped name shows up at compile time instead of hiding until the code runs.

defmodule Broken do @behaviour Printer end

Broken defines no print function, so compiling it warns that the Printer callback is missing. Treat behaviour warnings as errors during study and fill in every callback before moving on.

GenServer is a behaviour (preview)

Behaviours power the OTP framework behind long lived Elixir services. GenServer is the famous example: it handles processes, messages, and restarts, while you supply small callbacks such as init.

defmodule Counter do use GenServer def init(count) do {:ok, count} end end

Counter asks GenServer for all process machinery and only teaches it how to start from a count. Later lessons build a full server on this pattern, so remember that use plus callbacks shape every OTP module.

Next: The pipe operator in Elixir

Article author: Arthur Isaev

Related articles
Elixir
Elixir course: zero to hero in 50 lessons
What is Elixir and where it runs
Install Elixir
iex: the interactive shell
Your first script
Variables
Numbers
Strings
Atoms
Truthiness: only false and nil
Conditions
Recursion replaces loops
Lists
Tuples
Maps
Keyword lists
Functions
Defaults and clauses
Pattern matching
case
with chains
Modules in Elixir
import, alias, require, use in Elixir
Structs in Elixir
Protocols in Elixir
Behaviours in Elixir
The pipe operator in Elixir
Enum in Elixir
Stream in Elixir
Comprehensions in Elixir
Advanced strings in Elixir
Sigils
Binaries and charlists
Exceptions
ok and error tuples
Files and IO
Processes
GenServer
Supervisors
Tasks and Agents
OTP applications
Mix projects
Dependencies
Testing with ExUnit
Doctests
Debugging
Configs
Releases
Capstone: todo CLI
Capstone: HTTP server
Hero roadmap: the whole course on one page
Install Elixir on Windows 11
Install Elixir on Ubuntu
Install Elixir on Rocky Linux
Install Elixir on macOS
Install Elixir on FreeBSD
Elixir in Docker

Search this site

Channel @aofeed Chat @aofeedchat

Contacts and cooperation:
I recommend our hosting beget.com
Write to info@aredel.com if you:
1. Want to write an article for our site or translate an article into your native language.
2. Want to place thematically relevant ads on the site.
3. Ads on my site pass maximum censorship. If you see an ad block unsuitable for school-age children, shocking or misleading - please contact us by e-mail
4. Found a mistake, inaccuracy, bug, etc. on the site. ... .......
5. Articles can be shared on social media by clicking a network icon: