当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Access.filter用法及代码示例


Elixir语言中 Access.filter 相关用法介绍如下。

用法:

filter(func)
(从 1.6.0 开始)
@spec filter((term() -> boolean())) ::
  access_fun(data :: list(), current_value :: list())

返回一个函数,该函数访问列表中与提供的谓词匹配的所有元素。

返回的函数通常作为访问器传递给 Kernel.get_in/2 Kernel.get_and_update_in/3 和朋友。

例子

iex> list = [%{name: "john", salary: 10}, %{name: "francine", salary: 30}]
iex> get_in(list, [Access.filter(&(&1.salary > 20)), :name])
["francine"]
iex> get_and_update_in(list, [Access.filter(&(&1.salary <= 20)), :name], fn prev ->
...>   {prev, String.upcase(prev)}
...> end)
{["john"], [%{name: "JOHN", salary: 10}, %{name: "francine", salary: 30}]}

filter/1 也可用于从列表中弹出元素或列表中的键:

iex> list = [%{name: "john", salary: 10}, %{name: "francine", salary: 30}]
iex> pop_in(list, [Access.filter(&(&1.salary >= 20))])
{[%{name: "francine", salary: 30}], [%{name: "john", salary: 10}]}
iex> pop_in(list, [Access.filter(&(&1.salary >= 20)), :name])
{["francine"], [%{name: "john", salary: 10}, %{salary: 30}]}

如果没有找到匹配项,则返回一个空列表,并且永远不会调用更新函数

iex> list = [%{name: "john", salary: 10}, %{name: "francine", salary: 30}]
iex> get_in(list, [Access.filter(&(&1.salary >= 50)), :name])
[]
iex> get_and_update_in(list, [Access.filter(&(&1.salary >= 50)), :name], fn prev ->
...>   {prev, String.upcase(prev)}
...> end)
{[], [%{name: "john", salary: 10}, %{name: "francine", salary: 30}]}

如果谓词不是函数或元数不正确,则会引发错误:

iex> get_in([], [Access.filter(5)])
** (FunctionClauseError) no function clause matching in Access.filter/1

如果访问的结构不是列表,则会引发错误:

iex> get_in(%{}, [Access.filter(fn a -> a == 10 end)])
** (RuntimeError) Access.filter/1 expected a list, got: %{}

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Access.filter(func)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。