Structs in Elixir

Contents
defstruct
Build them
Update syntax
Enforce keys

defstruct

A struct is a map with a fixed set of keys and a module attached to it. You declare the shape with defstruct inside a module, giving each field a default value.

defmodule User do defstruct name: "guest", age: 0 end

Every User map now carries name and age keys, and the User name travels with the data so functions can match on it. Fields without defaults can use a plain list of atoms instead of keyword pairs.

Build them

Build a struct with percent syntax and the module name, then list only the fields you want to set. Missing fields fall back to the defaults from defstruct.

user = %User{name: "Ada", age: 36}

The variable user now holds a User struct with name Ada and age 36. Struct syntax also works in patterns, so matching on %User pulls the fields out at once.

Update syntax

Structs are immutable, so an update builds a fresh struct that shares most of the old one. The pipe character inside percent braces names the changed fields after a vertical bar.

older = %{user | age: 37}

The result keeps the name Ada and moves age to 37, while user itself stays unchanged. Update syntax only accepts keys that already exist, which catches typos at compile time.

Enforce keys

Some fields have no sensible default, such as a database id. The enforce annotation lists keys that every constructor call must provide, and missing keys fail at once.

defmodule Account do @enforce_keys [:id] defstruct [:id, balance: 0] end

Building a struct with id 7 works, while building one without id raises because the key is missing. Enforced keys move a whole class of mistakes from runtime logic to struct creation, where they are easy to spot.

Next: Protocols 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
Banner image

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: