I just tried to create a struct without fields (because: why not?).
It’s not possible with defstruct, which insists on an argument.
Best it can do is
defstruct _: nil # nice
btw, this is not OK:
defstruct [_]
isn’t that inconsistent?
So I tried to figure out what defstruct does. From the docs:
To define a struct, a developer must define both __struct__/0 and __struct__/1 functions. defstruct/1 is a convenience macro which defines such functions with some conveniences.
The reason this doesn’t work is that you cannot assign _. The first example works because :_ is not _, so you can do defstruct [:_] which is equivalent to your first example.
This is the macro that’s called underneath when defining a new struct. Going over the definition should help you better understand manually defining a struct in a module.
I left a lot of parts out in the following example but this might give you an idea
defmodule StructWithoutFields do
@struct %{__struct__: __MODULE__}
def __struct__(kv) do
Enum.reduce(kv, @struct, fn {key, val}, map ->
Map.replace!(map, key, val)
end)
end
def __struct__() do
@struct
end
end
thanks for the great advice, can’t fully understand the defstruct-macro yet, but I’ll take a look at the book. (feeling a little too stupid for that right now, not having thought about defstruct []).