ilya-kolpakov
Structs: enforce_keys is not a good name
By defining a struct one guarantees that the instances’ keys are exactly those provided in the definition. By including a key within the enforce_keys attribute one ensures that the corresponding values cannot be nil.
In my view, the attribute name enforce_keys suggests that the keys listed there will be always present in the struct (which is actually the case for all keys provided in the definition) rather than that the corresponding values cannot be nil.
Most Liked
chrismccord
Sorry, I was saying that your ideal view is the current behavior. For example:
iex(1)> defmodule A do
...(1)> @enforce_keys [:name]
...(1)> defstruct [:name, :age]
...(1)> end
{:module, A,
<<70, 79, 82, 49, 0, 0, 8, 128, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 1, 14,
0, 0, 0, 27, 8, 69, 108, 105, 120, 105, 114, 46, 65, 8, 95, 95, 105, 110,
102, 111, 95, 95, 9, 102, 117, 110, 99, ...>>, %A{age: nil, name: nil}}
iex> %A{age: 1}
** (ArgumentError) the following keys must also be given when building struct A: [:name]
expanding struct: A.__struct__/1
iex:3: (file)
iex> %A{name: nil}
%A{age: nil, name: nil}
Enforce keys doesn’t care about nil values, only keys. Does that clear things up?
ilya-kolpakov
Oh I see. So keys listed under enforce_keys must be present in the constructor and that’s all. They are, in a sense, like positional args to functions as they need to be always present.
Popular in Discussions
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
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









