在elixir中的Map中交换两个值的功能方法是什么?

时间:2018-11-05 10:26:12

标签: elixir

我的地图定义如下:

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 :(得分:5)

您可以使用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

两种情况下的最终结果都相同,这取决于您使用的偏好。

答案 1 :(得分:1)

您可以通过访问旧地图的值来定义新地图:

%{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"}