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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。