Каков функциональный способ поменять два значения на карте в эликсире? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть карта, определенная ниже:

iex(tbc@192-168-1-8)2> map = %{ 1 => {name => "Joey"}, 2 => {name => "Lee"}}

Я хочу поменять значение двух имен, чтобы оно выглядело так:

%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Joey"}}

Я знаю, что могу использовать приведенный ниже код для реализации этого:

iex(tbc@192-168-1-8)3> name1 = Map.get(map, 1)
%{"name" => "Joey"}
iex(tbc@192-168-1-8)4> name2 = Map.get(map, 2)
%{"name" => "Lee"}
iex(tbc@192-168-1-8)5> map = Map.put(map, 1, name2)
%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Lee"}}
iex(tbc@192-168-1-8)6> map = Map.put(map, 2, name1)
%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Joey"}}

но я не думаю, что это elixir стиль кодирования. Каков функциональный способ реализовать эту логику в эликсире?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете определить новую карту, используя значения старой:

%{1 => map[2], 2 => map[1]}

Если вы хотите поменять местами два элемента при сохранении остальной части карты, вы можете использовать

%{ map | 1 => map[2], 2 => map[1] }

В iex:

iex(1)> map = %{1 => "one", 2 => "two", 3 => "three", 4 => "four"}
%{1 => "one", 2 => "two", 3 => "three", 4 => "four"}
iex(2)> %{ map | 1 => map[2], 2 => map[1] }
%{1 => "two", 2 => "one", 3 => "three", 4 => "four"}
0 голосов
/ 05 ноября 2018

Вы можете использовать блок with, сначала извлекая имена, а затем создавая новую карту с ними:

with name1 <- Map.get(map, 1),
     name2 <- Map.get(map, 2)
do
     %{1 => name2, 2 => name1}
end

Или вы можете сделать простую функцию, сопоставить шаблон с ключами, получить значения и создать новую карту:

def swap(%{1 => name1, 2 => name2} do
     %{1 => name2, 2 => name1}
end

Конечный результат одинаков в обоих случаях, он зависит от ваших собственных предпочтений.

...