TIL: Pattern Matching On Structs
2021-08-17 Elixir pattern matching TILFor structs, which are also maps, we can use the %{} to match them too. However, if we want to ensure the target is a struct, instead of a plain map, we can use is_struct/1 or is_struct/2 guard.
Today I learned that we can also use %module{} pattern since Elixir v1.3.0. Here module is a variable, and can be a certain value holding the struct name, or _ for any.
Let's say we have a User module:
iex> defmodule User do
...> defstruct [:age, :name]
...> end
We can use %module{} pattern to match them:
# a struct can be matched with `%_{}`:
iex> %_{} = %User{}
%User{age: nil, name: nil}
# when we only know the module at run time:
iex> target = User
...> %target{} = %User{age: 5}
%User{age: 5, name: nil}
Comments