List Enum.reduce将字符串放入右侧列表
我有一个函数,它可以将字符串拆分为多个部分,我需要将这些部分放到params映射中的正确列表中 我现在发现无法调用远程函数Access.get/2内部匹配错误,我不确定如何解决该问题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术语 其他的
有什么建议吗?您需要在缩小功能中返回一个新地图,其中包含更新的列表。一种方法是使用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)