Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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
List Enum.reduce将字符串放入右侧列表_List_Dictionary_Enums_Elixir_Reduce - Fatal编程技术网

List Enum.reduce将字符串放入右侧列表

List Enum.reduce将字符串放入右侧列表,list,dictionary,enums,elixir,reduce,List,Dictionary,Enums,Elixir,Reduce,我有一个函数,它可以将字符串拆分为多个部分,我需要将这些部分放到params映射中的正确列表中 我现在发现无法调用远程函数Access.get/2内部匹配错误,我不确定如何解决该问题 有什么建议吗?您需要在缩小功能中返回一个新地图,其中包含更新的列表。一种方法是使用Map.update!: 虽然@Dogbert的解决方案肯定非常健壮,但我会对代码进行一些重构,使其更加简洁: Enum.reduceparts,参数,fn p-> 钥匙= 如果字符串.u以?p结尾,*do :通配符\u术语 其他的

我有一个函数,它可以将字符串拆分为多个部分,我需要将这些部分放到params映射中的正确列表中

我现在发现无法调用远程函数Access.get/2内部匹配错误,我不确定如何解决该问题


有什么建议吗?

您需要在缩小功能中返回一个新地图,其中包含更新的列表。一种方法是使用Map.update!:


虽然@Dogbert的解决方案肯定非常健壮,但我会对代码进行一些重构,使其更加简洁:

Enum.reduceparts,参数,fn p-> 钥匙= 如果字符串.u以?p结尾,*do :通配符\u术语 其他的 :搜索术语 终止 地图更新!参数,键,fn ps->[p | ps]结束 终止 或者,如果您希望更详细、更慢,请参阅下面有价值的Dogbert评论,但基于匹配mapper参数的方法易于阅读:

部分 |>Enum.map和String.reverse/1 |>枚举还原图,fn =p-> %{params|通配符_terms:[p|params.wildcard_terms]} p-> %{params | search_terms:[p | params.search_terms]} 终止
这里最根本的问题是,你的思维不是一成不变的。params[:wildcard_terms]=[p | params[:wildcard_terms]]不做您认为它做的事情。它不会更新与map参数中的键相关联的值,因为您可能习惯于使用其他语言(如Ruby/Java/Python)。这就是为什么dogbert的解决方案提倡使用Map.update!,它在幕后创建了一个新的映射,除了与指定键相对应的值外,其他值都相同。但是第二个映射的速度会非常慢-结束于?是O1,而String.reverse将在上复制整个二进制文件。@Dogbert是的,确实如此,谢谢。我添加了一个通知;我不确定当需要反转时,这是否更易于阅读,但我想总体上宣传/演示模式匹配方法。
parts = String.split(term_string, " ")

params = %{
  search_terms: [],
  wildcard_terms: [],
  minus_terms: [],
  room_terms: [],
  messages_to_terms: [],
  messages_from_terms: [],
  date_before_terms: [],
  date_after_terms: [],
  date_on_terms: [],
  date_during_terms: []
}

Enum.reduce(parts, params, fn p ->
  cond do
    String.ends_with?(p, "*") ->
      params[:wildcard_terms] = [p | params[:wildcard_terms]]

    true ->
      params[:search_terms] = [p | params[:search_terms]]
  end
end)
Enum.reduce(parts, params, fn p ->
  cond do
    String.ends_with?(p, "*") ->
      Map.update!(params, :wildcard_terms, fn ps -> [p | ps] end)

    true ->
      Map.update!(params, :search_terms, fn ps -> [p | ps] end)
  end
end)