Сплат-выражения
Сплат-выражение позволяет более кратко записать распространённую операцию, которую иначе можно было бы выполнить с помощью выражения for.
Если var.list — это список объектов, у каждого из которых есть атрибут id, то список идентификаторов можно получить с помощью следующего выражения for:
[for o in var.list : o.id]
Это эквивалентно следующему сплат-выражению:
var.list[*].id
Специальный символ [*] перебирает все элементы списка слева от него и получает у каждого из них атрибут, имя которого указано справа. Сплат-выражение также можно использовать для доступа к атрибутам и индексам элементов списка составных типов, добавляя последовательность операций справа от символа:
var.list[*].interfaces[0].name
Приведённое выше выражение эквивалентно следующему выражению for:
[for o in var.list : o.interfaces[0].name]
Сплат-выражения с картами
Описанные выше шаблоны сплат-выражений применимы только к спискам, множествам и кортежам. Чтобы получить аналогичный результат для значения карты или объекта, необходимо использовать выражения for.
Ресурсы, в которых используется аргумент for_each, представлены в выражениях как карта объектов, поэтому для таких ресурсов нельзя использовать сплат-выражения. Подробнее см. в разделе Обращение к экземплярам ресурсов.
Одиночные значения как списки
При применении к значению, которое не является списком, множеством или кортежем, сплат-выражения ведут себя особым образом.
Если значение не равно null, сплат-выражение преобразует его в список из одного элемента или, точнее, в кортеж из одного элемента. Если значение равно null, сплат-выражение возвращает пустой кортеж.
Это особое поведение может быть полезно для модулей, принимающих необязательные входные переменные, значением по умолчанию которых является null, обозначающее отсутствие значения. Благодаря этому модуль может адаптировать значение переменной для работы с возможностями языка OpenTofu, предназначенными для коллекций. Например:
variable "website_setting" {
type = object({
index_document = string
error_document = string
})
default = null
}
resource "aws_s3_bucket" "example" {
# ...
dynamic "website" {
for_each = var.website_setting[*]
content {
index_document = website.value.index_document
error_document = website.value.error_document
}
}
}В приведённом выше примере используется блок dynamic, который создаёт ноль или более вложенных блоков на основе значения коллекции. Входная переменная var.website_setting определена как отдельный объект, который может иметь значение null, поэтому в выражении for_each блока dynamic используется [*], чтобы гарантировать создание одного блока, если вызывающий модуль задаёт аргумент website, и нуля блоков, если он оставляет значение null.
Это особое поведение сплат-выражений может быть неочевидно читателям, незнакомым с ним, поэтому мы рекомендуем использовать его только в аргументах for_each и подобных случаях, когда контекст подразумевает работу с коллекцией. В противном случае смысл выражения может быть неясен будущим читателям.
Устаревшие сплат-выражения (только для атрибутов)
В более ранних версиях языка OpenTofu использовался несколько иной вариант сплат-выражений, который OpenTofu продолжает поддерживать для обратной совместимости. Этот старый вариант менее полезен, чем описанная выше современная форма, поэтому мы не рекомендуем использовать его в новых конфигурациях.
В устаревших сплат-выражениях «только для атрибутов» используется последовательность .* вместо [*]:
var.list.*.interfaces[0].name
Эта форма имеет незначительное отличие в поведении и эквивалентна следующему выражению for:
[for o in var.list : o.interfaces][0].name
Обратите внимание: в сплат-выражении только для атрибутов операция индексации [0] применяется к результату итерации, а не является частью самой итерации. К каждому элементу входных данных применяются только операции получения атрибутов. Это ограничение вызывало затруднения у некоторых пользователей старых версий OpenTofu, поэтому мы рекомендуем всегда использовать новые сплат-выражения с [*], обеспечивающие более последовательное поведение.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.10/language/expressions/splat/