Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pattern matching 将结构与其传递到当前函数的字段子集进行匹配_Pattern Matching_Elixir - Fatal编程技术网

Pattern matching 将结构与其传递到当前函数的字段子集进行匹配

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

我正在构建一个过滤API。简单地说,我有一个函数,它包含一个结构列表和一个过滤器映射。我的问题是,传入函数参数时,将
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
,而不包含它。谢谢你的澄清,好吧。