Sebb
Struct without fields
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__/0and__struct__/1functions.defstruct/1is a convenience macro which defines such functions with some conveniences.
Where are __struct__/x documented?
Structs are usually defined with the
Kernel.defstruct/1macro
What if I want to be unusual? How can I define a struct by hand, maybe even without fields?
Marked As Solved
NobbZ
Using an empty list as argument to defstruct/1works for me:
iex(1)> defmodule S do
...(1)> defstruct []
...(1)> end
iex(2)> %S{}
%S{}
Also Liked
aiwaiwa
One legitimate reason would be to implement a protocol without data.
Use case: postgrex/lib/postgrex/parameters.ex at v0.16.5 · elixir-ecto/postgrex · GitHub
dimitarvp
sheharyarn
Like @Nobbz said, you can just do this:
defmodule X, do: defstruct []
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.
Last Post!
aiwaiwa
One legitimate reason would be to implement a protocol without data.
Use case: postgrex/lib/postgrex/parameters.ex at v0.16.5 · elixir-ecto/postgrex · GitHub
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









