【发布时间】:2018-12-11 23:05:14
【问题描述】:
我有这张地图:
%{
"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}) 对地图进行模式匹配,但我不能对 case 条件使用相同的模式匹配?
更新
这就是我正在尝试的
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
【问题讨论】:
-
什么是
condition?! -
我想将匹配条件作为键和值作为值,所以我可以像 "#{condition} ... #{key}" 一样使用它,但恐怕是不可能的正确的?我必须始终知道这样做的关键名称
-
是的,密钥是强制性的。如果您确定存在唯一的键值对,您可以将其转换为
Keyword并对其进行模式匹配:%{} = map -> [{key, value}] = Map.to_list(map)。