I'm playing around with pattern match and I found out, that it's not quite easy to pattern match parameters of a method against an empty map. I thought it would go something like this:
defmodule PatternMatch do def modify(%{}) do %{} end def modify(map) do # expensive operation %{ modified: "map" } end end
But it seems like the first function clause matches arbitrary maps:
iex> PatternMatch.modify(%{a: "map"}) ==> %{}
Is there another way to check for empty maps?
It works this way by design, but admittedly it can be a bit confusing at first glance. This feature allows you to destructure maps using pattern matching, without having to specify all keys. For example:
iex> %{b: value} = %{a: 1, b: 2, c: 3} %{a: 1, b: 2, c: 3} iex> value 2
Consequently, %{}
will match any map. If you want to match an empty map in a function, you have to use a guard clause:
defmodule PatternMatch do def modify(map) when map == %{} do %{} end def modify(map) do # ... end end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With