是否可以像本例中那样进行多个案例匹配? 我想合并两个地图,地图,可以是这样的:
map1 = %{"test" => [list]}
map2 = %{"test" => [list2]}
如果我知道v1和v2都是列表,我可以像这样合并它们:
Map.merge(map1, map2, fn _k, v1, v2 ->
do something with v1 and v2 knowing they are list
like Enum.concat(v1, v2)
end)
但是可以在case子句中检查v1和v2吗?
Map.merge(map1, map2, fn _k, v1, v2 ->
case v1, v2 do
[v1] [v2] -> they are lists, do something with them
_ -> they are other thing
end
end)
答案 0 :(得分:2)
你的语法非常接近。尝试给你的lambda多个签名,在语法上看起来非常类似于一个案例:
defmodule TestMerge do
def merge(map1, map2) do
Map.merge(map1, map2, fn
_k, l1, l2 when is_list(l1) and is_list(l2) ->
#they are lists, do something with them
:lists
_, _, _ ->
#they are other thing
:not_lists
end)
end
end
为了测试,我们用所有四种可能性来调用它(键指示哪个组合,例如两个映射在:both
键之后有一个列表,第一个映射在:first
键之后有一个列表,但不是第二张地图等):
iex> TestMerge.merge(%{first: [], last: 1, both: [], neither: 1},
...> %{first: 2, last: [], both: [], neither: 1})
%{both: :lists, first: :not_lists, last: :not_lists, neither: :not_lists}
答案 1 :(得分:1)
您可以在合并前检查条件map1和map2是否为列表:
result =
cond do
is_list(map1) && is_list(map2) -> Map.merge(...)
true -> :they_are_other_thing
end
如果map1和map2中的一个不是列表,则将使用真实条件,并且在此示例中结果为:they_are_other_thing
。以下是一些cond示例。