vitalydolgov

vitalydolgov

Pattern matching in `case` for maps

I have a question on pattern matching in case. This function

def f(map) do
  case map do
    %{a: i} -> i
    %{} -> :empty
    _ -> :other
  end
end

works in this way:

> f(%{a: 67})
67
> f(%{b: 67})
:empty
> f(%{})
:empty

Can anybody explain me why it matches on the second clause, when non-empty map provided? I’m on Elixir 1.11.

Marked As Solved

Werner

Werner

It is also in the hexdocs the reference for it, in the section on maps:

“Note that the empty map will match all maps,…”

https://hexdocs.pm/elixir/master/patterns-and-guards.html

Also Liked

RudManusachi

RudManusachi

Hi @vitalydolgov :wave:t2: And welcome to the community!

%{} matches any map.

To match against empty map you could use either map_size/1 function or compare with %{} explicitly in guard as:

def f(map) do
  case map do
    # any map that has key :a
    %{a: i} -> i

    # empty map
    map when map == %{} -> :empty

    # map with exactly 1 key but not :a
    map when map_size(map) == 1 -> :one_key_not_a

    # any other map
    %{} -> :other

    # not a map
    _ -> :not_a_map
  end
end
dsounded

dsounded

Hey

But basically you just need to use a guard for the second case

Where Next?

Popular in Questions Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
logicmason
Hi there, I'm working through my first release with elixir/phoenix. I've built a release with distillery and found that it crashes when I...
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New

Other popular topics Top

Tee
can someone please explain to me how Enum.reduce works with maps
New
New
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement