Как обновить вложенную карту по несуществующему пути - PullRequest
0 голосов
/ 04 мая 2018

Существуют функции ядра для обновления вложенных структур данных в Elixir, Kernel.put_in / 3 и Kernel.update_in / 3, которые помогают обновлять неизменяемые структуры данных Elixir, используя путь и значение или функцию в последнем случае. .

Это пример из документации для update_in:

users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
update_in(users, ["john", :age], &(&1 + 1))
%{"john" => %{age: 28}, "meg" => %{age: 23}}

Как это нужно изменить, чтобы поддерживать размещение значений в несуществующем пути в структуре данных?

Вот что происходит в случае использования неизвестного первого элемента пути:

put_in(users, ["clara", :age], 29)
** (ArgumentError) could not put/update key :age on a nil value
    (elixir) lib/access.ex:379: Access.get_and_update/3
    (elixir) lib/map.ex:773: Map.get_and_update/3
    (elixir) lib/kernel.ex:2057: Kernel.put_in/3

Желаемый результат будет следующим:

%{"john" => %{age: 27}, "meg" => %{age: 23}, "clara" => %{age: 29}}

1 Ответ

0 голосов
/ 04 мая 2018

Вы можете использовать Access.key/2, чтобы указать значение по умолчанию для определенного ключа, если его нет. В этом случае вам нужно по умолчанию значение ключа "clara" до %{}:

iex(1)> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
iex(2)> put_in(users, [Access.key("clara", %{}), :age], 29)
%{"clara" => %{age: 29}, "john" => %{age: 27}, "meg" => %{age: 23}}
...