我有这张地图:
%{
"a" => "1",
"b" => "2",
"c" => "3",
"d" => "4",
"e" => %{"f" => "5"}
}
我可以这样迭代其键值:
Enum.map(map, fn({k, v}) ->
v
end)
像元组一样使用fn ({k, v})
,我得到的是这样的东西:
["1", "2", "3", "4", %{"f" => "5"}]
但是我不明白为什么这行不通:
Enum.map(map, fn({k, v}) ->
case v do
{key, value} -> "inner map"
_ -> "something else"
end)
["something else", "something else", "something else", "something else",
"something else"]
我可以用fn({k, v})
模式匹配地图,但是我不能对大小写条件使用相同的模式匹配吗?
更新
这就是我正在尝试的
some = %{"a" => "1", "b" => "2", "c" => "3", "d" => "4", "e" => %{"f" => "5"}}
Enum.map(some, fn({k, v}) ->
case v do
%{^condition => value} -> "inner map"
_ "something else"
end
end)
** (CompileError) iex:15: unknown variable ^condition. No variable "condition" has been defined before the current pattern
(stdlib) lists.erl:1354: :lists.mapfoldl/3
答案 0 :(得分:4)
{key, value}
不是地图,而是元组。您需要:
Enum.map(map, fn({k, v}) ->
case v do
%{} = map -> "inner map: #{inspect map}"
_ -> "something else"
end
end)
#⇒ ["something else", "something else",
# "something else", "something else",
# "inner map: %{\"f\" => \"5\"}"]
是否证明了密钥的存在,可能会直接将其值与模式匹配(注意固定在key
上):
key = "f"
Enum.map(map, fn({k, v}) ->
case v do
%{^key => v} -> "inner map with value: #{inspect v}"
_ -> "something else"
end
end)
#⇒ ["something else", "something else",
# "something else", "something else",
#⇒ "inner map with value: \"5\""]