I didn’t have room for this in my book
This topic is explored in more depth in my book
These two statements contradict each other, perhaps the footer on the blog is generic and doesn’t apply in this case?
I think behaviours also deserve a mention along with protocols. My experience is that it’s quite rare to write a protocol, compared to a behaviour.
For example, Eq could also be implemented using a behaviour:
defmodule Eq do
@callback eq?(a :: struct, b :: map) :: boolean
def eq?(%type{} = a, b) do
type.eq?(a, b)
end
end
defmodule Cat do
defstruct [:name, :microchip]
@behaviour Eq
def eq?(%Cat{microchip: a}, %{microchip: b}), do: a == b
end
iex(1)> Eq.eq?(%Cat{microchip: "foo"}, %{microchip: "foo"})
true
iex(2)> Eq.eq?(%Cat{microchip: "foo"}, %{microchip: "bar"})
false


















