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


Elixir Enumerable用法及代码示例


Elixir语言中 Enumerable 相关用法介绍如下。

Enum Stream 模块使用的可枚举协议。

当您调用 Enum 模块中的函数时,第一个参数通常是必须实现此协议的集合。例如,表达式Enum.map([1, 2, 3], &(&1 * 2)) 调用 Enumerable.reduce/3 来执行减少操作,该操作通过在集合中的每个元素上调用映射函数&(&1 * 2) 并使用累积列表使用该元素来构建映射列表。

在内部, Enum.map/2 实现如下:

def map(enumerable, fun) do
  reducer = fn x, acc -> {:cont, [fun.(x) | acc]} end
  Enumerable.reduce(enumerable, {:cont, []}, reducer) |> elem(1) |> :lists.reverse()
end

请注意,用户提供的函数被包装到 reducer/0 函数中。 reducer/0 函数必须在每一步之后返回一个标记的元组,如 acc/0 类型中所述。最后, Enumerable.reduce/3 返回 result/0

该协议使用标记元组在 reducer 函数和实现该协议的数据类型之间交换信息。这允许高效地枚举资源,例如文件,同时还保证资源将在枚举结束时关闭。该协议还允许暂停枚举,这在需要在许多可枚举之间进行交错时很有用(如在zip/1zip/2 函数中)。

该协议需要实现四个函数, reduce/3 count/1 member?/2 slice/1 。该协议的核心是 reduce/3 函数。所有其他函数都作为数据结构的优化路径存在,可以在比线性时间更好的时间内实现某些属性。

相关用法


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