Splat-выражения
Splat-выражение позволяет более кратко записать распространённую операцию, которую иначе можно было бы выполнить с помощью выражения for.
Если var.list — это список объектов, у каждого из которых есть атрибут id, то список идентификаторов можно получить с помощью следующего выражения for:
[for o in var.list : o.id]
Это эквивалентно следующему splat-выражению:
var.list[*].id
Специальный символ [*] перебирает все элементы списка слева от него и обращается к атрибуту с именем, указанным справа. Splat-выражение также можно использовать для доступа к атрибутам и индексам в списках сложных типов, добавляя последовательность операций справа от символа:
var.list[*].interfaces[0].name
Приведённое выше выражение эквивалентно следующему выражению for:
[for o in var.list : o.interfaces[0].name]
Splat-выражения с картами
Показанные выше шаблоны splat-выражений применимы только к спискам, множествам и кортежам. Чтобы получить аналогичный результат с картой или значением объекта, необходимо использовать выражения for.
Ресурсы, в которых используется аргумент for_each, будут представлены в выражениях в виде карты объектов, поэтому для таких ресурсов нельзя использовать splat-выражения. Дополнительную информацию см. в разделе Обращение к экземплярам ресурсов.
Одиночные значения как списки
Splat-выражения ведут себя особым образом, если применить их к значению, которое не является списком, множеством или кортежем.
Если значение не равно null, splat-выражение преобразует его в список из одного элемента или, точнее, в кортеж из одного элемента. Если значение равно null, splat-выражение вернёт пустой кортеж.
Такое поведение может быть полезно для модулей, принимающих необязательные входные переменные, значением по умолчанию которых является 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.
Такое особое поведение splat-выражений может быть неочевидно читателю, который с ним не знаком, поэтому мы рекомендуем использовать его только в аргументах for_each и в похожих ситуациях, где из контекста следует работа с коллекцией. В противном случае смысл выражения может быть неясен будущим читателям.
Устаревшие splat-выражения (только для атрибутов)
В ранних версиях языка OpenTofu использовался немного иной вариант splat-выражений, поддержку которого OpenTofu сохраняет для обратной совместимости. Этот старый вариант менее полезен, чем описанная выше современная форма, поэтому мы не рекомендуем использовать его в новых конфигурациях.
В устаревших splat-выражениях «только для атрибутов» используется последовательность .* вместо [*]:
var.list.*.interfaces[0].name
Эта форма работает немного иначе и эквивалентна следующему выражению for:
[for o in var.list : o.interfaces][0].name
Обратите внимание: в splat-выражении только для атрибутов операция индексирования [0] применяется к результату итерации, а не в её ходе. К каждому элементу входных данных применяются только операции получения атрибутов. Это ограничение вызывало затруднения у некоторых пользователей ранних версий OpenTofu, поэтому мы рекомендуем всегда использовать splat-выражения нового типа с [*], чтобы поведение было более предсказуемым.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/expressions/splat/