mirror of
https://github.com/jbranchaud/til
synced 2026-01-03 07:08:01 +00:00
Add Requiring Keys For Structs as an elixir til
This commit is contained in:
39
elixir/requiring-keys-for-structs.md
Normal file
39
elixir/requiring-keys-for-structs.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Requiring Keys For Structs
|
||||
|
||||
When defining a
|
||||
[`struct`](http://elixir-lang.org/getting-started/structs.html) in Elixir,
|
||||
we may want to ensure that certain values are provided. We can require that
|
||||
certain keys are used in the creation of a struct with the
|
||||
[`@enforce_keys`](https://hexdocs.pm/elixir/Kernel.html#defstruct/1)
|
||||
attribute. Here is an example of a `Name` struct.
|
||||
|
||||
```elixir
|
||||
defmodule Name do
|
||||
@enforce_keys [:first, :last]
|
||||
defstruct [:first, :middle, :last]
|
||||
end
|
||||
```
|
||||
|
||||
With this defined, we can create a struct that uses all of the keys.
|
||||
|
||||
```elixir
|
||||
> jack = %Name{first: "Jack", middle: "Francis", last: "Donaghy"}
|
||||
%Name{first: "Jack", last: "Donaghy", middle: "Francis"}
|
||||
```
|
||||
|
||||
We can also ignore `:middle` and just provide the required keys.
|
||||
|
||||
```elixir
|
||||
> liz = %Name{first: "Liz", last: "Lemon"}
|
||||
%Name{first: "Liz", last: "Lemon", middle: nil}
|
||||
```
|
||||
|
||||
We cannot, however, omit any of the keys specified in `@enforce_keys`. If we
|
||||
do omit any of them, Elixir will raise an error.
|
||||
|
||||
``` elixir
|
||||
> tracy = %Name{first: "Tracy"}
|
||||
** (ArgumentError) the following keys must also be given when building struct Name: [:last]
|
||||
expanding struct: Name.__struct__/1
|
||||
iex:6: (file)
|
||||
```
|
||||
Reference in New Issue
Block a user