Maps as map keys
I ran into some code at work that was using maps as map keys. Something to the effect of
defmodule User do
defstruct [:name, :age]
end
user1 = %User{name: "Alice", age: 30}
user2 = %User{name: "Bob", age: 25}
# Using structs as keys in a map
map = %{user1 => "User 1 Data", user2 => "User 2 Data"}
IO.puts(map[user1]) # Outputs "User 1 Data"
I didn't realize you could actually do this. But it makes sense if you dive into the elixir documentation it's front and center
Maps do not impose any restriction on the key type: anything can be a key in a map. 1.
Caveats
I wouldn't recommend using maps as keys for two reasons:
- Uniqueness and mutability: All values of the map that are being used as the key must be strictly equal. So for example, if you modify
user1
above and attempt to use the modified version to access themap
the key would not be found in the map. - Performance: Using large structs as keys can impact the performance of lookups, inserts, and deletes, because Elixir has to use the entire content of the struct to compute its hash value.