【问题标题】:Pattern matching Enum.map vs case condition模式匹配 Enum.map 与 case 条件
【发布时间】: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)

标签: pattern-matching elixir


【解决方案1】:

{key, value} 不是一个ma​​p,它是一个tuple。你需要:

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

【讨论】:

  • mm 如果我知道 map 总是只有一个键,我可以像 %{key => value} 那样进行模式匹配吗?
  • 更新了答案。
  • 我试过了,但我收到未知变量 ^key。在当前模式之前没有定义变量“key”
  • 请复制粘贴整个sn-p。注意第一行是key = "f"。您可能只使用%{"f" => v},但我想展示最通用的示例。
  • 我的意思是 复制粘贴我的 sn-p。可能只pin 现有变量。
猜你喜欢
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2013-04-25
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多