Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pattern match function against empty map

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?

like image 919
leifg Avatar asked Oct 21 '15 00:10

leifg


1 Answers

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 
like image 171
Patrick Oscity Avatar answered Oct 11 '22 21:10

Patrick Oscity