當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。