Fl4m3Ph03n1x

Fl4m3Ph03n1x

Use guards on anonymous functions

Background

I have a filter to where I am passing an anonymous function. In this function I want to check that the key of the tuple I am evaluation is a string and if so return true, like in the following code:

:persistent_term.put("hello", :world)

:persistent_term.get() 
|> Enum.filter(fn {key, _val} when is_binary(key)-> true end)

Error

However, when I do so, I get an error:

** (FunctionClauseError) no function clause matching in :erl_eval."-inside-an-interpreted-fun-"/1    
    
    The following arguments were given to :erl_eval."-inside-an-interpreted-fun-"/1:
    
        # 1
        {Logger.Config.DeletedHandlers,
         [
           {:primary, %{level: :notice}},
           {:default, :logger_std_h,
            %{
              config: %{
                burst_limit_enable: true,
                burst_limit_max_count: 500,
                burst_limit_window_time: 1000,
                drop_mode_qlen: 200,
                filesync_repeat_interval: :no_repeat,
                flush_qlen: 1000,
                overload_kill_enable: false,
                overload_kill_mem_size: 3000000,
                overload_kill_qlen: 20000,
                overload_kill_restart_after: 5000,
                sync_mode_qlen: 10,
                type: :standard_io
              },
              filter_default: :stop,
              filters: [
                remote_gl: {&:logger_filters.remote_gl/2, :stop},
                domain: {&:logger_filters.domain/2, {:log, :super, [:otp, :sasl]}},
                no_domain: {&:logger_filters.domain/2, {:log, :undefined, []}}
              ],
              formatter: {:logger_formatter, %{legacy_header: true, single_line: false}},
              id: :default,
              level: :all,
              module: :logger_std_h
            }}
         ]}
    
    (stdlib) :erl_eval."-inside-an-interpreted-fun-"/1
    (stdlib) erl_eval.erl:829: :erl_eval.eval_fun/6
    (elixir) lib/enum.ex:2942: Enum.filter_list/2

What really makes this confusing is that a similar function works as expected:


:persistent_term.get()
    |> Enum.filter(fn {key, _val} -> if is_binary(key) do true else false end end)

They both do the same, except the second one works and the first one doesn’t. According to the documentation I know I can use guards in anonymous functions:

https://hexdocs.pm/elixir/master/guards.html#where-guards-can-be-used

So, it is clear to me that I am doing something wrong.

Questions

1 .What am I missing?
2. Is this the most compact way of verifying if a key is a string?

Marked As Solved

david_ex

david_ex

Enum.filter must be able to apply the given function to each individual input. In your example, that’s not the case (some inputs in the collection don’t satisfy the guard).

To fix it, add a clause matching _ that simply returns false:

:persistent_term.get() 
|> Enum.filter(fn
    {key, _val} when is_binary(key)-> true
    _ -> false
end)

Although I would personally find this more readable for what you’re trying to do:

Enum.filter(:persistent_term.get(), fn {key, _val} -> is_binary(key) end)

Also Liked

idi527

idi527

:waving_hand:

Would that work?

:persistent_term.get() 
|> Enum.filter(fn {key, _val} -> is_binary(key) end)

Where Next?

Popular in Questions Top

hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
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
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
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

Other popular topics Top

hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" => #BSON.ObjectId<58eb1a7a9ad169198c3dXXXX>, "email" => ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 49266 226
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40165 209
New
AngeloChecked
What learn first? Rust or Elixir Hi Elixir community! I’m here because i want learn a new language. I’m a junior developer and mainly i ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New

We're in Beta

About us Mission Statement