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


Elixir Range用法及代码示例


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

范围表示零、一个或多个升序或降序整数的序列,具有称为步长的共同差异。

范围始终包含在内,并且可能具有自定义步骤。在范围上创建和匹配的最常见形式是通过 first..last first..last//step 符号,auto-imported 来自 Kernel

iex> Enum.to_list(1..3)
[1, 2, 3]
iex> Enum.to_list(1..3//2)
[1, 3]
iex> Enum.to_list(3..1//-1)
[3, 2, 1]

范围也可以有一个元素:

iex> Enum.to_list(1..1)
[1]
iex> Enum.to_list(1..1//2)
[1]

甚至根本没有元素:

iex> Enum.to_list(10..0//1)
[]
iex> Enum.to_list(0..10//-1)
[]

当定义一个没有步长的范围时,步长将根据范围的第一个和最后一个位置来定义,如果是first >= last,它将是一个递增的范围,步长为1。否则,它是一个递减的范围。但请注意,不推荐使用隐式递减范围。因此,如果您需要从 31 的递减范围,最好改为编写 3..1//-1

定义

递增范围 first..last//step 是从 firstlast 增加 step 的范围,其中 step 必须是正整数,所有值 v 必须是 first <= v and v <= last 。因此,范围 10..0//1 是一个空范围,因为没有值 v10 <= v and v <= 0

同样,递减范围 first..last//step 是从 firstlast 递减 step 的范围,其中 step 必须是负整数,而值 v 必须是 first >= v and v >= last 。因此,范围 0..10//-1 是一个空范围,因为没有值 v0 >= v and v >= 10

表示

在内部,范围表示为结构:

iex> range = 1..9//2
1..9//2
iex> first..last//step = range
iex> first
1
iex> last
9
iex> step
2
iex> range.step
2

您可以直接访问范围字段(firstlaststep),但不应手动修改或创建范围。而是使用正确的运算符或 new/2 new/3

范围实现了 Enumerable 协议,这意味着 Enum 模块中的函数可用于处理范围:

iex> range = 1..10
1..10
iex> Enum.reduce(range, 0, fn i, acc -> i * i + acc end)
385
iex> Enum.count(range)
10
iex> Enum.member?(range, 11)
false
iex> Enum.member?(range, 8)
true

无论范围大小如何,此类函数调用在内存方面都是有效的。 Enumerable 协议的实现使用仅基于端点的逻辑,并没有具体化整个整数列表。

相关用法


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