Structs in Elixir
| 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