メインコンテンツにスキップ

range 関数

range は、開始値、制限値、およびステップ値を使用して数値のリストを生成します。

コードブロック
range(max)
range(start, limit)
range(start, limit, step)

start 引数と step 引数は省略できます。省略した場合、start はデフォルトでゼロになり、steplimitstart より大きいか小さいかによって、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",
# ]
# }