- OpenTofu 言語
- 関数
- range
range
関数
range
は、開始値、制限値、およびステップ値を使用して数値のリストを生成します。
range(max)
range(start, limit)
range(start, limit, step)
start
引数と step
引数は省略できます。省略した場合、start
はデフォルトでゼロになり、step
は limit
が start
より大きいか小さいかによって、1 または -1 になります。
結果のリストは、指定された start
値から始まり、結果が limit
と等しいか超えるまで step
を繰り返し加算することによって作成されます。
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",
# ]
# }