Pattern matching 将结构与其传递到当前函数的字段子集进行匹配
我正在构建一个过滤API。简单地说,我有一个函数,它包含一个结构列表和一个过滤器映射。我的问题是,传入函数参数时,将Pattern matching 将结构与其传递到当前函数的字段子集进行匹配,pattern-matching,elixir,Pattern Matching,Elixir,我正在构建一个过滤API。简单地说,我有一个函数,它包含一个结构列表和一个过滤器映射。我的问题是,传入函数参数时,将Enum.filter与&match?配对不起作用: def filter_structs(structs,filters)do #这总是返回[] 结构|>Enum.filter(&match?(^filters,&1)) 结束 但如果我改为硬编码过滤器,事情会很顺利: def filter_structs(structs,_filters)do structs |>Enum.f
Enum.filter
与&match?
配对不起作用:
def filter_structs(structs,filters)do
#这总是返回[]
结构|>Enum.filter(&match?(^filters,&1))
结束
但如果我改为硬编码过滤器,事情会很顺利:
def filter_structs(structs,_filters)do
structs |>Enum.filter(&match?({some_field:true},&1))
结束
我有这个解决办法,但它不是很漂亮。。。没有更好的解决办法了吗
def filter_structs(structs,filters)do
结构
|>枚举过滤器(fn s->
Map.equal?(过滤器,s |>Map.take(过滤器|>Map.keys))
(完)
结束
映射可以在变量键上使用%{^key=>}
进行模式匹配,在变量键上使用%{^key=>^value}
进行值对匹配
使用match?(^filters,map)
对整个映射进行匹配,如果map===filters
,则只返回true
,而不包含它
下面的实现利用了模式匹配,并且可能更清楚地了解其意图:
def filter_structs(structs, filters) do
Enum.filter(structs, fn struct ->
Enum.all?(filters, fn {field, value} ->
match?(%{^field => ^value}, struct)
end)
end)
end
+1对sabiwara的回答
我想你的版本也不错。尽管我可能会在没有管道的情况下编写它:
def filter_structs(structs,filters)do
keys=Map.keys(过滤器)
枚举过滤器(结构和(过滤器===Map.take(&1,键)))
结束
>使用match?(^filters,map)
匹配整个映射时,如果map==filters
,则只返回true
,而不包含它。谢谢你的澄清,好吧。