При обновлении значения во вложенной карте в Elixir мы можем использовать Kernel.put_in/3

map = %{hi: "what's", up: %{my: "boii"}}
%{hi: "what's", up: %{my: "boii"}}

Kernel.put_in(map, [:up, :my], "dawg") 
%{hi: "what's", up: %{my: "dawg"}}

Почему эта функция не определена вместе с Map.put/3, учитывая, что их входные данные и результаты очень похожи?

1
FelixFortis 22 Окт 2020 в 21:34

1 ответ

Лучший ответ

Функция Kernel.put_in работает в любой структуре, которая обладает поведением Access, в соответствии с ее документацией:

@spec put_in(Access.t(), nonempty_list(term), term) :: Access.t()
def put_in(data, [_ | _] = keys, value) do
  elem(get_and_update_in(data, keys, fn _ -> {nil, value} end), 1)
end

Поведение доступа поддерживается как списками Maps, так и списками ключевых слов, поэтому put_in не является эксклюзивным для Maps, поэтому находится в модуле ядра.

Пример использования в списках ключевых слов:

iex(1)> Kernel.put_in([foo: 3], [:foo], 4)
[foo: 4]
iex(2)> Kernel.put_in([foo: [bar: 3]], [:foo, :bar], 4)
[foo: [bar: 4]]
5
Julio GB 22 Окт 2020 в 18:54