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

Zha*_* Yi 1 elixir

我的地图定义如下:

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

我想交换两个名称的值,使它看起来像:

%{1 => %{"name" => "Lee"}, 2 => %{"name" => "Joey"}}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用下面的代码来实现这个:

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"}}
Run Code Online (Sandbox Code Playgroud)

但我认为这不是elixir编码风格.在elixir中实现这种逻辑的功能方法是什么?

Mát*_*áté 5

您可以使用with块,首先提取名称,然后使用它们创建新地图:

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

或者你可以做一个简单的功能,键上的模式匹配,获取值并生成一个新的地图:

def swap(%{1 => name1, 2 => name2} do
     %{1 => name2, 2 => name1}
end
Run Code Online (Sandbox Code Playgroud)

最终结果在两种情况下都是相同的,这取决于您自己的偏好.