Elixir語言中 Collectable
相關用法介紹如下。
一種遍曆數據結構的協議。
函數使用此協議將可枚舉插入到集合中:Enum.into/2
iex> Enum.into([a: 1, b: 2], %{})
%{a: 1, b: 2}
為什麽要收藏?
協議對於從集合中取出值很有用。為了支持廣泛的值,Enumerable
協議提供的函數不保持形狀。例如,將映射傳遞給Enumerable
總是返回一個列表。Enum.map/2
這種設計是故意的。
旨在支持無限集合、資源和其他具有固定形狀的結構。例如,將值插入 Enumerable
是沒有意義的,因為它具有固定的形狀,其中僅存儲範圍限製和步長。Range
模塊旨在填補Collectable
協議留下的空白。 Enumerable
可以看作是 Collectable.into/1
的反麵。如果Enumerable.reduce/3
中的函數是關於取出值,那麽Enumerable
是關於將這些值收集到一個結構中。Collectable.into/1
例子
為了展示如何手動使用
協議,讓我們使用 Collectable
的簡化實現。MapSet
iex> {initial_acc, collector_fun} = Collectable.into(MapSet.new())
iex> updated_acc = Enum.reduce([1, 2, 3], initial_acc, fn elem, acc ->
...> collector_fun.(acc, {:cont, elem})
...> end)
iex> collector_fun.(updated_acc, :done)
#MapSet<[1, 2, 3]>
為了展示如何實現該協議,我們可以再次查看
的簡化實現。在此實現中,"collecting" 元素僅意味著通過 MapSet
將它們插入集合中。MapSet.put/2
defimpl Collectable, for: MapSet do
def into(map_set) do
collector_fun = fn
map_set_acc, {:cont, elem} ->
MapSet.put(map_set_acc, elem)
map_set_acc, :done ->
map_set_acc
_map_set_acc, :halt ->
:ok
end
initial_acc = map_set
{initial_acc, collector_fun}
end
end
所以現在我們可以調用
:Enum.into/2
iex> Enum.into([1, 2, 3], MapSet.new())
#MapSet<[1, 2, 3]>
相關用法
- Elixir Code.prepend_path用法及代碼示例
- Elixir Code.compiler_options用法及代碼示例
- Elixir Config.config_env用法及代碼示例
- Elixir Code.quoted_to_algebra用法及代碼示例
- Elixir Code.put_compiler_option用法及代碼示例
- Elixir Config.config用法及代碼示例
- Elixir Config.Reader用法及代碼示例
- Elixir Config.Reader.merge用法及代碼示例
- Elixir Code用法及代碼示例
- Elixir Code.ensure_compiled用法及代碼示例
- Elixir Code.format_string!用法及代碼示例
- Elixir Code.required_files用法及代碼示例
- Elixir Code.get_compiler_option用法及代碼示例
- Elixir Code.Fragment.cursor_context用法及代碼示例
- Elixir Code.available_compiler_options用法及代碼示例
- Elixir Code.ensure_loaded?用法及代碼示例
- Elixir Code.eval_quoted用法及代碼示例
- Elixir Code.require_file用法及代碼示例
- Elixir Config用法及代碼示例
- Elixir Config.import_config用法及代碼示例
- Elixir Code.Fragment.container_cursor_to_quoted用法及代碼示例
- Elixir Code.Fragment.surround_context用法及代碼示例
- Elixir Code.delete_path用法及代碼示例
- Elixir Config.Provider用法及代碼示例
- Elixir Code.append_path用法及代碼示例
注:本文由純淨天空篩選整理自elixir-lang.org大神的英文原創作品 Collectable。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。