You could compose a function like this:

```elixir
def rename_keys(map, key_mapping) do
  Enum.into(map, %{}, fn {key, value} -> 
    {Map.fetch(key_mapping, key), value}
  end)
end

%{my_map: :is_cool}
|> rename_keys(%{my_name: :my_new_map})

# => %{my_new_map: :is_cool}
```

If you don’t want to put / drop. That way you don’t have to spell out the 
99-key map, and it’s easy to pipe together with other functions.

It’s also more efficient than the proposed rename_keys would be as you can 
rename multiple keys in one pass.

Adam


> On 12 Oct 2020, at 16:49, jonar...@gmail.com <jonarnet...@gmail.com> wrote:
> 
> > Maybe if you want to keep the other keys as is, then "rename_key" can be 
> > handy
> 
> This is the use case I had in mind. Let's say I have a map with 100 keys, but 
> only need to rename one of them. In that event, today I would write something 
> like this:
> 
> {val, new_map} = Map.pop(original_map, :original_name)
> Map.put(new_map, :new_name, val)
> 
> Explicitly defining a new map with 99 keys matching exactly and only one 
> changed would be a very large amount of effort, and brittle. With a 
> Map.rename_key/2 function, I could write the following, which (to Bruce's 
> point) would fit nicely in a pipe chain:
> 
> Map.rename_key(original_map, :original_name, :new_name)
> 
> > what happens if you add a new key to post? Does it automatically appear in 
> > the new_map? Or should it not?
> 
> The new key should appear in the new map. The only thing that 
> Map.rename_key/3 (or Map.rename_keys/3) should do is exchange one key for 
> another, without consideration for the rest of the map at all. I enjoy using 
> maps where flexibility is more important than the guarantees that the 
> strictness of structs. If I were converting one struct to another, I would 
> explicitly map each key as in you example above
> 
> new_thing = %Thing{
>   user_id: post.author_id,
>   content: post.body,
>   ...
> }
> 
> The application of Map.rename_key[s]/3 is more for a proxy application, where 
> data is being shuttled from one place to another with a minor modification. I 
> may or may not know (or care) what the entirety of the map looks like, I 
> simply know that if a given key is present it needs to be replaced with a 
> different one.
> On Monday, October 12, 2020 at 7:25:46 AM UTC-4 José Valim wrote:
> Hi everyone,
> 
> I thought I had commented on this thread but apparently I have not, so 
> apologies for the delay.
> 
> I am not convinced about this functionality because I honestly do not find 
> this:
> new_map =
>   post
>   |> Map.rename_key(:user_id, :author_id)
>   |> Map.rename_key(:body, :content)
> clearer than this:
> 
> new_map = %{
>   user_id: post.author_id,
>   content: post.body,
>   ...
> }
> 
> Maybe if you want to keep the other keys as is, then "rename_key" can be 
> handy, but even then, what happens if you add a new key to post? Does it 
> automatically appear in the new_map? Or should it not?
> 
> Even if we say that "clearer" is personal, there are practical reasons for 
> preferring the latter, such as the runtime can optimize it better (as all 
> keys are literals and the map is not built dynamically), and it is easier to 
> typecheck maps with known keys.
> 
> So my $.02 here is that this is not something I would necessarily endorse 
> and, if you really want to rename only certain keys inside a map, you can do 
> it with a helper function or by using put+drop on the desired keys.
> 
> Thanks!
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to elixir-lang-core+unsubscr...@googlegroups.com 
> <mailto:elixir-lang-core+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/elixir-lang-core/a9edf077-9a58-4e51-af54-cd0732b3fbf3n%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/elixir-lang-core/a9edf077-9a58-4e51-af54-cd0732b3fbf3n%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/93D23AF9-12CB-44BC-9231-A3FE90200C96%40a-corp.co.uk.

Reply via email to