Elixir 关键字列表上的模式匹配

Elixir 关键字列表上的模式匹配,elixir,Elixir,我试图从关键字列表中删除某些字段。我试过了,但我卡住了。我做错了什么 [what: "country", url: "asdf", matches: "AQ"] |> Enum.map(fn([:what, :url, :matches]) -> [:what, :url] end) 编辑: 预期产出为: [what: "country", url: "asdf"] 我不确定这是不是最惯用的方式。您想要一个关键字列表作为输出吗 编辑: 答案是在对问题进行编辑之前发布的,所以现在不

我试图从关键字列表中删除某些字段。我试过了,但我卡住了。我做错了什么

[what: "country", url: "asdf", matches: "AQ"]
|> Enum.map(fn([:what, :url, :matches]) -> [:what, :url] end)
编辑:

预期产出为:

[what: "country", url: "asdf"]
我不确定这是不是最惯用的方式。您想要一个关键字列表作为输出吗

编辑:

答案是在对问题进行编辑之前发布的,所以现在不太相关


如果需要关键字列表作为输出,请使用
关键字.take

在关键字列表上调用
Enum.map
时,逐个遍历元组
{key,value}
。这会导致错误
**(FunctionClauseError)没有与之匹配的函数子句

这取决于你最终想要什么。如果您想要关键字列表的子集,作为关键字列表,您可以这样做

[what: "country", url: "asdf", matches: "AQ"]
|> Keyword.take([:what, :url])
它将返回
[什么:“国家”,url:“asdf”]

如果你想要一张地图,你可以使用上面@denis.peplin提出的解决方案

如果出于某种原因,您仍然希望或需要使用
Enum.map
和模式匹配执行此操作,您可以执行以下操作:

[what: "country", url: "asdf"]
|> Enum.map(fn
  {k, _v} = tup when k in [:what, :url] -> tup
  _ -> nil
end) |> Enum.reject(&is_nil/1)

您可以直接使用
关键字。在关键字列表中选择/2
<代码>[what:“country”,url:“asdf”,匹配“AQ”]|>关键字。获取([:what,:url])
,返回关键字list@sbacaro,将此作为答案发布。让我们看看cjm2671到底想要什么。对于任何对模式匹配关键字列表感兴趣的人:
[what: "country", url: "asdf"]
|> Enum.map(fn
  {k, _v} = tup when k in [:what, :url] -> tup
  _ -> nil
end) |> Enum.reject(&is_nil/1)