模式匹配Enum.map与案例条件

时间:2018-07-03 15:10:12

标签: pattern-matching elixir

我有这张地图:

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

1 个答案:

答案 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\""]