- OpenTofu 语言
- 函数
- range
range
函数
range
使用起始值、限制值和步长值生成一个数字列表。
range(max)
range(start, limit)
range(start, limit, step)
start
和 step
参数可以省略,在这种情况下,start
默认值为零,step
默认值为 1 或 -1,具体取决于 limit
是否大于或小于 start
。
生成的列表是通过从给定的 start
值开始,并重复添加 step
直到结果等于或超过 limit
来创建的。
limit
的解释取决于 step
的方向:对于正步长,当下一个数字大于或等于 limit
时,序列完成。对于负步长,当小于或等于时,序列完成。
序列构建算法遵循以下伪代码
let num = start
while num < limit: (or, for negative step, num > limit)
append num to the sequence
num = num + step
return the sequence
由于序列是在内存中创建的物理列表,因此 OpenTofu 对结果序列中的数字数量设置了一个人为限制 1024,以防止在意外传递非常大的值作为限制或非常小的值作为步长时出现无限制的内存使用。如果上面的算法将第 1025 个数字追加到序列,则该函数立即退出并报错。
我们建议尽可能地迭代现有集合,而不是创建范围。但是,在与其他集合结合使用时,创建小的数字序列在某些情况下可能很有用,例如在集合操作函数或 for
表达式中。
示例
> range(3)
[
0,
1,
2,
]
> range(1, 4)
[
1,
2,
3,
]
> range(1, 8, 2)
[
1,
3,
5,
7,
]
> range(1, 4, 0.5)
[
1,
1.5,
2,
2.5,
3,
3.5,
]
> range(4, 1)
[
4,
3,
2,
]
> range(10, 5, -2)
[
10,
8,
6,
]
range
函数主要用于处理其他集合,以生成一定数量的某个实例。例如
variable "name_counts" {
type = map(number)
default = {
"foo" = 2
"bar" = 4
}
}
locals {
expanded_names = {
for name, count in var.name_counts : name => [
for i in range(count) : format("%s%02d", name, i)
]
}
}
output "expanded_names" {
value = local.expanded_names
}
# Produces the following expanded_names value when run with the default
# "name_counts":
#
# {
# "bar" = [
# "bar00",
# "bar01",
# "bar02",
# "bar03",
# ]
# "foo" = [
# "foo00",
# "foo01",
# ]
# }