Protocols and Structs

Understand the protocols and structs in Elixir.

We'll cover the following

Elixir doesn’t have classes, but perhaps surprisingly it does have user-defined types. It pulls this off using structs and a few conventions.

Example

Let’s play with a simple struct. Here’s the definition:

defmodule Blob do 
  defstruct content: nil
end

And here, we use it in IEx:

iex> c "basic.exs"
[Blob]
iex> b = %Blob{content: 123} 
%Blob{content: 123}
iex> inspect b
%Blob{content: 123}"

It looks as if we’ve created some new type, the Blob. That’s only because Elixir is hiding something from us. By default, inspect recognizes structs. If we turn this off using the structs: false option, inspect reveals the true nature of our Blob value:

iex> inspect b, structs: false 
"%{__struct__: Blob, content: 123}"

A struct value is actually just a map with the key __struct__ referencing the struct’s module (Blob in this case) and the remaining elements containing the keys and values for this instance. The inspect implementation for maps checks for this. If we ask it to inspect a map containing a key __struct__ that references a module, it displays it as a struct.

Many built-in types in Elixir are represented as structs internally. It’s instructive to try creating values and inspecting them with structs: false.

Run the commands given in the above snippets to execute the code below:

Get hands-on with 1400+ tech skills courses.