关键字列表上的模式匹配

时间:2019-02-22 13:59:52

标签: elixir

我正在尝试将某些字段从关键字列表中删除。我已经尝试过了,但是卡住了。我在做什么错了?

> Type: Item
> Total: 2
> Item Type: Head

Property List: ['Stat1', 'Stat3']

编辑:

预期输出为:

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

2 个答案:

答案 0 :(得分:3)

当您在关键字列表上调用Enum.map时,您将一一遍历元组{key, value}。导致错误** (FunctionClauseError) no function clause matching

这取决于您想要的结果。如果您希望将关键字列表的一部分作为关键字列表,则可以

[what: "country", url: "asdf", matches: "AQ"]
|> Keyword.take([:what, :url])

哪个将返回[what: "country", 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)

答案 1 :(得分:1)

[what: "country", url: "asdf", matches: "AQ"]
|> Map.new()
|> Map.take([:what, :url])

我不确定这是最惯用的方式。您是否希望将关键字列表作为输出?

编辑:

答案是在对问题进行编辑之前发布的,因此现在它并不十分相关。

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